/*
 * @Author: sefon
 * @Date: 2016-07-24 11:48:22
 */

'use strict';
const utils = '../../../utils';
const searchApi = require('./search-api');
const shopApi = require('./shop-api');
const headerModel = require('../../../doraemon/models/header');
const productProcess = require(`${utils}/product-process`);
const searchHandler = require('./search-handler');
const shopHandler = require('./shop-handler');
const helpers = global.yoho.helpers;
const crypto = global.yoho.crypto;
const _ = require('lodash');

const limitNum = 60; // 商品每页显示数目
const needParams = ['query', 'msort', 'misort', 'gender', 'shelveTime'];

// 品牌页folder名称
const brandFolderSeries = '经典系列';

// 搜索分类信息需要的参数
const positionId = 10;

// 获取分类左侧广告id
const sortAdsId = 79;


const _getGender = (channel) => {
    let gender;

    switch (channel) {
        case 'boys':
            gender = '1,3';
            break;
        case 'girls':
            gender = '2,3';
            break;
        default:
            gender = '1,2,3';
            break;
    }

    return gender;
};

/**
 * 获取商品分类列表数据
 */
const getListData = (params, channel) => {
    let standard = [];

    _.forEach(params, (value, key) => {
        let s = _.split(key, 'parameter_', 2);

        if (s.length > 1) {
            standard.push(`${s[1]}_${value}`);
            _.unset(params, `${key}`);
        }
    });

    if (standard.length) {
        params.standard = standard.join(',');
    }

    let searchParams = searchHandler.getSearchParams(params);

    // 调用接口
    let apiMethod = [
        headerModel.requestHeaderData(channel),
        searchApi.getSortList(Object.assign({}, {msort: '', misort: ''})),
        searchApi.getProductList(searchParams)
    ];

    // 搜索分类介绍和广告
    if (params.msort && params.misort && !isNaN(params.misort)) {
        let IntroParams = {
            max_sort_id: params.msort,
            middle_sort_id: params.misort,
            gender: params.gender || '1,3'
        };

        apiMethod.push(searchApi.getSortIntro(Object.assign(IntroParams, {position_id: positionId})));
        apiMethod.push(searchApi.getSortAds(Object.assign(IntroParams, {position_id: sortAdsId})));
    }

    return Promise.all(apiMethod).then(result => {
        let finalResult = {
            headerData: Object.assign(result[0].headerData, {
                header: true
            }),
            list: {
                leftContent: {}
            }
        };

        // 获取左侧类目数据
        if (result[1].code === 200) {
            let dps = {};

            _.forEach(needParams, (value) => {
                if (params[value]) {
                    dps[value] = params[value];
                }
            });

            finalResult.list = Object.assign(
                searchHandler.handlePathNavData(result[1].data.sort, params, 'sort', channel), {
                    leftContent: searchHandler.handleSortData(result[1].data.sort, dps, params)
                });
        }

        // 获取商品数据和顶部筛选条件
        if (result[2].code === 200) {
            let filters = Object.assign(searchHandler.handleFilterDataAll(result[2].data, params),
                finalResult.list.leftContent.sort);

            filters.checkedConditions.conditions = _.concat(filters.checkedConditions.conditions,
                finalResult.list.leftContent.checked);

            Object.assign(finalResult.list, {
                filters: filters,
                opts: searchHandler.handleOptsData(params, result[2].data.total, result[2].data.filter),
                totalCount: result[2].data.total,
                footPager: searchHandler.handlePagerData(result[2].data.total, params),
                goods: productProcess.processProductList(result[2].data.product_list,
                    Object.assign({showDiscount: false}, params, {
                        from: {type: 'list', params: params}
                    })),
                hasNextPage: searchHandler.handleNextPage(params, result[2].data.total),

                // 最近浏览记录
                latestWalk: 6
            });
        }

        // 分类介绍
        if (result[3] && result[3].code === 200) {
            finalResult.list.sortIntro = searchHandler.handleSortIntro(result[3].data);
        }

        // 分类广告
        if (result[4] && result[4].code === 200) {
            Object.assign(finalResult.list.leftContent, searchHandler.handleSortAds(result[4].data));
        }

        finalResult.criteo = {skn: searchHandler.getCriteo(_.get(finalResult.list, 'goods'))};

        let seo = searchHandler.getListSeo(channel,
            _.get(finalResult, 'list.leftContent.allSort.list'),
            _.get(finalResult, 'list.filters.checkedConditions.conditions'));

        return Object.assign({}, seo, finalResult);
    });
};

/**
 * 获取新品到着数据
 */
const getListNewData = (params, channel) => {

    let searchParams = searchHandler.getSearchParams(params);

    // 调用接口
    let apiMethod = [
        headerModel.requestHeaderData(channel),
        searchApi.getSortList(Object.assign({}, {msort: '', misort: ''})),
        searchApi.getProductList(Object.assign(searchParams), 'newProduct'),
        searchApi.getWeekNew(params)
    ];

    return Promise.all(apiMethod).then(result => {
        let finalResult = {
            headerData: Object.assign(result[0].headerData, {
                header: true
            }),
            list: {
                leftContent: {}
            }
        };
        let dps = {};

        _.forEach(needParams, (value) => {
            if (params[value]) {
                dps[value] = params[value];
            }
        });

        // 获取左侧类目数据
        if (result[1].code === 200) {
            finalResult.list = Object.assign(
                searchHandler.handlePathNavData(result[1].data.sort, params, 'new', channel), {
                    leftContent: searchHandler.handleSortData(result[1].data.sort, dps, params)
                });
        }

        // 获取商品数据和顶部筛选条件
        if (result[2].code === 200) {
            let filters = Object.assign(searchHandler.handleFilterDataAll(result[2].data, params),
                finalResult.list.leftContent.sort);

            filters.checkedConditions.conditions = _.concat(filters.checkedConditions.conditions,
                finalResult.list.leftContent.checked);

            Object.assign(finalResult.list, {
                filters: filters,
                opts: searchHandler.handleOptsData(params, result[2].data.total, result[2].data.filter),
                totalCount: result[2].data.total,
                footPager: searchHandler.handlePagerData(result[2].data.total, params),
                goods: productProcess.processProductList(result[2].data.product_list,
                    Object.assign({showDiscount: false, showNew: false,
                        from: {type: 'listNew', params: params}}, params)),
                hasNextPage: searchHandler.handleNextPage(params, result[2].data.total),

                // 最近浏览记录
                latestWalk: 7
            });
        }

        // 新品上架
        if (result[3] && result[3].code === 200) {
            Object.assign(finalResult.list.leftContent, searchHandler.handleWeekNew(result[3].data, dps));
        }

        finalResult.criteo = {skn: searchHandler.getCriteo(_.get(finalResult.list, 'goods'))};

        let seo = searchHandler.getNewSeo(channel, _.get(finalResult, 'list.leftContent.newSales.list'));

        return Object.assign({}, seo, finalResult);
    });
};

/**
 * 根据品牌域名查询品牌信息
 */
const getBrandInfo = (params) => {
    return searchApi.getBrandData(params).then(result => {

        if (result.code !== 200 || !result.data) {
            return {};
        }

        return {
            brandId: result.data.id,
            brandNameEn: result.data.brand_name_en || '',
            brandNameCn: result.data.brand_name_cn || '',
            brandBanner: result.data.brand_banner || '',
            node: result.data.static_content_code || '',
            brandAbout: result.data.brand_intro || '',
            shopTemplateType: result.data.shop_template_type || 0,
            url: helpers.urlFormat('', '', result.data.brand_domain),
            name: result.data.brand_name,
            shopId: result.data.shop_id || 0,
            type: result.data.type || 0,
            brandDomain: result.data.brand_domain
        };

    });
};

/**
 * 获取品牌页面数据
 */
const getBrandData = (params, extra, channel) => {
    let queryBase = {};
    let searchParams = searchHandler.getSearchParams(params);

    if (params.shopId) {
        // 店铺以店铺ID查询商品
        Object.assign(queryBase, {
            shop_id: params.shopId,
            shop: params.shopId
        });
    } else {
        // 品牌以品牌ID查询商品
        queryBase.brand = extra.brandId;
    }

    // 设置品牌默认排序方式
    let order = params.order || 'b_w_desc';

    // 调用接口
    let apiMethod = [
        headerModel.requestHeaderData(channel),
        searchApi.getSortList(queryBase),
        searchApi.getProductList(Object.assign(searchParams, {order: order}, queryBase))
    ];

    if (queryBase.brand) {
        apiMethod.push(searchApi.getBrandCouponAsync(queryBase.brand));
    }

    return Promise.all(apiMethod).then(result => {
        let finalResult = {
            headerData: Object.assign(result[0].headerData, {
                header: true
            }),
            brand: {
                brandBanner: searchHandler.handleBrandBanner(extra),
                leftContent: {},
                node: extra.node || '',
                brandId: extra.brandId
            }
        };

        // 获取左侧类目数据
        if (result[1].code === 200) {
            let dps = {};

            _.forEach(needParams, (value) => {
                if (params[value]) {
                    dps[value] = params[value];
                }
            });

            if (queryBase.shop_id) {
                dps.shopId = queryBase.shop_id;
            }

            Object.assign(finalResult.brand, {
                leftContent: searchHandler.handleSortData(result[1].data.sort, dps, params)
            }, searchHandler.handlePathNavData(extra, params, 'brand', channel));
        }

        // 获取商品数据和顶部筛选条件
        if (result[2].code === 200) {
            let filters = Object.assign(searchHandler.handleFilterDataAll(result[2].data, params),
                finalResult.brand.leftContent.sort);

            filters.checkedConditions.conditions = _.concat(filters.checkedConditions.conditions,
                finalResult.brand.leftContent.checked);

            Object.assign(finalResult.brand, {
                filters: filters,
                opts: searchHandler.handleOptsData(params, result[2].data.total, result[2].data.filter),
                totalCount: result[2].data.total,
                footPager: searchHandler.handlePagerData(result[2].data.total, params),
                goods: productProcess.processProductList(result[2].data.product_list,
                    Object.assign({showDiscount: false, from: {type: 'brand', params: params}}, params)),
                hasNextPage: searchHandler.handleNextPage(params, result[2].data.total),

                // 最近浏览记录
                latestWalk: 7
            });

            // 品牌页不显示品牌筛选项
            _.unset(finalResult, 'brand.filters.brand');
        }

        if (result[3] && result[3].data) {
            finalResult.brand.coupon = searchHandler.handleBrandShopCoupons(
                _.get(result[3], 'data.coupons', []), {brandId: extra.brandId});
        }

        finalResult.criteo = {skn: searchHandler.getCriteo(_.get(finalResult.brand, 'goods'))};

        let seo = searchHandler.getBrandShopSeo(channel, extra, params);

        return Object.assign({}, seo, finalResult);
    });
};

/**
 * 获取品牌介绍页面数据
 */
const getBrandAbout = (domain, uid, channel) => {
    channel = channel || 'boys';

    return Promise.all([
        headerModel.requestHeaderData(channel),
        searchApi.getBrandData({domain: domain})
    ]).then(result => {
        let home;
        let finalResult = {
            headerData: Object.assign(result[0].headerData, {
                header: true
            })
        };

        switch (channel) {
            case 'girls':
                home = helpers.urlFormat('/woman', {}, 'new');
                break;
            case 'lifestyle':
                home = helpers.urlFormat('/lifestyle', {}, 'new');
                break;
            case 'kids':
                home = helpers.urlFormat('/kids', {}, 'new');
                break;
            default:
                home = helpers.urlFormat('');
                break;
        }

        if (result[1].code === 200) {
            let data = result[1].data || {};
            let extra = {
                brandId: data.id,
                brandNameEn: data.brand_name_en || '',
                brandNameCn: data.brand_name_cn || '',
                brandBanner: data.brand_banner || '',
                node: data.static_content_code || '',
                brandAbout: data.brand_intro || '',
                shopTemplateType: data.shop_template_type || 0,
                url: helpers.urlFormat('', '', data.brand_domain),
                name: data.brand_name,
                shopId: data.shop_id || 0,
                type: data.type || 0,
                brandDomain: data.brand_domain
            };

            finalResult.brand = {
                brandBanner: searchHandler.handleBrandBanner(extra),
                pathNav: [
                    {
                        href: home,
                        name: `${_.toUpper(channel)}首页`,
                        pathTitle: 'YOHO!BUY 有货'
                    },
                    {
                        href: helpers.urlFormat('/brands'),
                        name: '品牌一览',
                        pathTitle: '品牌一览'
                    },
                    {
                        name: `${extra.brandNameEn} ${extra.brandNameCn}`
                    }
                ],
                brandAbout: {
                    brandIntro: extra.brandAbout
                }
            };
        }

        return finalResult;
    });
};


/**
 * 获取店铺介绍页面数据
 */
const getShopAbout = (shopId, uid, channel) => {
    let resData = {};

    return Promise.all([
        headerModel.requestHeaderData(channel),
        searchApi.getShopDecorator(shopId), // 店铺装修数据
        searchApi.getShopInfo(shopId, uid)
    ]).then(result => {
        resData.headerData = Object.assign(result[0].headerData, {
            header: true
        });

        if (result[1].code === 200) {
            let data = result[1].data || {},
                decorator = shopHandler.getShopDecorator(data, {}, shopId, true);

            Object.assign(decorator.shopTopBannerBase, {
                shopId: shopId,
                bannerHeight: 150,
                shopHome: `/?shopId=${shopId}`,
                shopIntro: `/about?shopId=${shopId}`,
                coled: _.get(result, '[2].data.is_favorite', 'N') === 'Y'
            });
            _.set(resData, 'brand.shopBanner', decorator.shopTopBannerBase);
            _.unset(resData, 'brand.brandBanner');
        }

        if (result[2].code === 200) {
            let data = result[2].data || {};

            _.set(resData, 'brand.brandAbout.brandIntro', data.shop_intro);
        }

        return resData;
    });
};

/**
 * 获取品牌页面水牌
 */
const getNodeContentData = (params) => {
    return searchApi.getNodeContent(params).then(result => {

        if (result.code === 200 && result.data) {
            return result.data;
        }
    });
};

/**
 * 获取品牌页面系列
 */
const getAdnav = (params) => {

    return Promise.all([searchApi.getBrandFolder(params), searchApi.getBrandSeries(params)]).then(result => {

        let dest = {
            picTitle: '',
            list: []
        };

        if (result[0].code === 200 && result[0].data) {
            dest.picTitle = brandFolderSeries;
            Object.assign(dest.list, searchHandler.handleFolderData(result[0].data));
        }

        if (result[1].code === 200 && result[1].data) {
            dest.picTitle = brandFolderSeries;
            Object.assign(dest.list, searchHandler.handleSeriesData(result[1].data));
        }


        return dest;
    });
};

/**
 *  获取店铺基本信息
 */

const getShopInfo = (shopId, uid) => {

    return searchApi.getShopInfo(shopId, uid).then(result => {
        if (result.code === 200) {
            return {
                brandName: result.data.shop_name,
                brandCont: result.data.shop_intro,
                domain: result.data.shop_domain,
                logo: result.data.shop_logo,
                isFavorite: result.data.is_favorite === 'Y',
                shopTemplateType: result.data.shop_template_type,
                multBrandShopType: result.data.mult_brand_shop_type,
                shopName: result.data.shop_name,
                showShopName: result.data.is_show_shop_name === 'Y'
            };
        } else {
            return {};
        }
    });
};

/**
 * 获取经典模板店铺数据
 * @param shopId
 * @param uid
 * @param params
 * @param shopInfo 店铺介绍
 */
const getShopData = (shopId, channel, params, shopInfo) => {
    let gender = _getGender(channel);

    params = params || {};
    params.shopId = shopId;

    return Promise.all([
        headerModel.requestHeaderData(channel), // 头部数据
        searchApi.getShopDecorator(shopId), // 店铺装修数据
        searchApi.getProductList(Object.assign({
            shop_id: shopId
        }, params)), // 搜索店铺商品
        searchApi.getShopBrands(shopId), // 店铺品牌数据
        shopApi.shopCouponListAsync(shopId) // 店铺优惠券数据
    ]).then(result => {
        let finalResult = {};

        Object.assign(finalResult,
            result[0], // 头部数据
            searchHandler.handlePathNavData(shopInfo, params, 'shop', channel), // 面包屑导航
            searchHandler.getBrandShopSeo(channel, {shopName: shopInfo.shopName || shopInfo.brandName}, params) // 店铺SEO
        );

        _.set(finalResult, 'headerData.header', true);

        // 店铺装修
        if (result[1].code === 200) {
            Object.assign(finalResult, shopHandler.getShopDecorator(result[1].data, params, shopId));

            _.set(finalResult, 'shopTopBanner.brandIntro', {
                shopId: shopId,
                brandName: shopInfo.brandName || '',
                isFavorite: shopInfo.isFavorite || false,
                brandCont: shopInfo.brandCont || ''
            });
        } else {
            return Promise.reject('No ShopDecorator data');
        }

        // 获取商品数据和顶部筛选条件
        if (result[2].code === 200) {
            let allGoods = {
                name: '全部商品 ALL',
                sort: searchHandler.handleOptsData(params, _.get(result[2], 'data.total', 0)),
                list: productProcess.processProductList(_.get(result[2], 'data.product_list', []), {
                    newCoverSort: true,
                    showDiscount: false,
                    gender: gender
                }),
                href: `/product/shoplist?navBar=1&shopId=${shopId}`
            };

            _.set(allGoods, 'sort.newPage', true); // 启用新的分页导航

            finalResult.allGoods = allGoods;
        }

        let sknList = []; // 资源位配置商品skn
        let prodList = _.concat(_.get(finalResult, 'newArrivel.list', []),
            _.get(finalResult, 'hotSingle.list', []));

        _.forEach(prodList, value => {
            sknList.push(value.productSkn);
        });

        let shopBrandIds = [], // 店铺的所有品牌id
            articleApiMethod = [], // 通过品牌获取相关文章接口
            apiMethod = [
                searchApi.getProductList({
                    viewNum: sknList.length,
                    query: _.join(_.uniq(sknList), ',')
                })
            ];

        if (result[3].code === 200 && result[3].data) {
            _.forEach(result[3].data, value => {
                shopBrandIds.push(value.brand_id);
                articleApiMethod.push(
                    searchApi.getArticleByBrand(value.brand_id, 'udid') // 品牌推荐文章
                );
            });
        }

        if (result[4].data && !_.isEmpty(result[4].data)) {
            finalResult.coupon = searchHandler.handleBrandShopCoupons(result[4].data, {shopId: shopId});
        }

        // 根据品牌获取分类 (腾讯云测试没有该接口,暂时不调用分类)
        apiMethod.push(searchApi.getSortList({brand: shopBrandIds}));
        apiMethod = _.concat(apiMethod, articleApiMethod);

        return Promise.all(apiMethod).then(subRes => {
            // 设置资源位商品封面图
            if (subRes[0].code === 200) {
                let list = {};

                prodList = productProcess.processProductList(_.get(subRes[0], 'data.product_list', []), {
                    newCoverSort: true,
                    showDiscount: false,
                    gender: gender
                });

                _.forEach(prodList, value => {
                    list[value.product_skn] = {
                        img: helpers.getForceSourceUrl(value.default_images) +
                        '?imageView2/1/w/{width}/h/{height}',
                        title: value.product_name,
                        price: `¥${value.sales_price}`
                    };
                });

                if (_.has(finalResult, 'newArrivel.list')) {
                    _.forEach(finalResult.newArrivel.list, value => {
                        if (list[value.productSkn]) {
                            Object.assign(value, list[value.productSkn]);
                        }
                    });
                }

                if (_.has(finalResult, 'hotSingle.list')) {
                    _.forEach(finalResult.hotSingle.list, value => {
                        if (list[value.productSkn]) {
                            Object.assign(value, list[value.productSkn]);
                        }
                    });
                }
            }

            if (subRes[1].code === 200) {
                let groupSort = _.get(subRes[1], 'data.sort', []);

                finalResult.leftContent = searchHandler.handleSortData(groupSort, params);

                if (finalResult.allGoods) {
                    Object.assign(finalResult.allGoods, searchHandler.setShopSort(groupSort, Object.assign({},
                        params, {page: 1})));
                }
            }

            let articleList = [];

            for (let i = 2; i < subRes.length; i++) {
                articleList = _.concat(articleList, _.get(subRes[i], 'data', []));
            }

            if (articleList.length >= 3) {
                let trendList = [];

                for (let i = 0; i < 3; i++) {
                    trendList.push({
                        href: helpers.urlFormat(`/${articleList[i].id}.html`, '', 'guang'),
                        src: helpers.getForceSourceUrl(articleList[i].src) +
                            '?imageView2/1/w/{width}/h/{height}',
                        mainTitle: articleList[i].title,
                        Subtitle: articleList[i].intro
                    });
                    articleList = _.concat(articleList, _.get(subRes[i], 'data', []));
                }

                finalResult.trendInfo = {
                    name: '潮流资讯 HOT ITEMS',
                    trendList: trendList
                };
            }

            return finalResult;
        });
    });
};

/**
 * 获取店铺商品数据
 */
const getShopGoodsData = (shopId, channel, params) => {
    let gender = _getGender(channel);
    let resData = {};

    _.unset(params, '_pjax');
    return Promise.all([
        searchApi.getProductList(Object.assign({
            shop_id: shopId
        }, params)), // 搜索店铺商品
        searchApi.getShopBrands(shopId) // 店铺品牌数据
    ]).then(result => {
        // 获取商品数据和顶部筛选条件
        if (result[0].code === 200) {
            Object.assign(resData, {
                sort: searchHandler.handleOptsData(params, _.get(result[0], 'data.total', 0)),
                list: productProcess.processProductList(_.get(result[0], 'data.product_list', []), {
                    newCoverSort: true,
                    showDiscount: false,
                    gender: gender
                })
            });
            _.set(resData, 'sort.newPage', true); // 启用新的分页导航
        }

        let shopBrandIds = []; // 店铺的所有品牌id

        if (result[1].code === 200 && result[1].data) {
            _.forEach(result[1].data, value => {
                shopBrandIds.push(value.brand_id);
            });
        }

        // 根据品牌获取分类 (腾讯云测试没有该接口,暂时不调用分类)
        return searchApi.getSortList({brand: shopBrandIds}).then(subRes => {
            if (subRes.code === 200) {
                let groupSort = _.get(subRes, 'data.sort', []);

                Object.assign(resData, searchHandler.setShopSort(groupSort, Object.assign(params,
                    {page: 1})));
            }

            return resData;
        });
    });
};

const getShopListData = (channel, params, uid) => {
    let gender = _getGender(channel),
        shopId = params.shopId,
        navBar = params.navBar || 1;
    let apiArr = [
        headerModel.requestHeaderData(channel), // 头部数据
        searchApi.getShopDecorator(shopId), // 店铺装修数据
        searchApi.getShopInfo(shopId, uid), // 店铺介绍
        searchApi.getProductList(Object.assign({shop_id: shopId}, params)), // 搜索店铺商品
        searchApi.getShopBrands(shopId) // 店铺品牌数据
    ];

    if (_.has(params, 'query')) {
        apiArr.push(searchApi.getProductList(Object.assign({shop_id: shopId},
            params, {query: ''}))); // 搜索店铺所有商品
    }


    return Promise.all(apiArr).then(result => {
        let finalResult = {
            headerData: Object.assign(result[0].headerData, {header: true})
        };

        // 面包屑导航
        Object.assign(finalResult, searchHandler.handlePathNavData({}, params, 'shop', channel));

        // 店铺装修
        if (result[1].code === 200) {
            Object.assign(finalResult, shopHandler.getShopDecorator(result[1].data, params, shopId));

            // 设置shop nav选中状态
            _.set(finalResult, `navigationBar[${navBar}].current`, true);

            if (result[2].code === 200) {
                let data = _.get(result[2], 'data', {});

                _.set(finalResult, 'shopTopBanner.brandIntro', {
                    shopId: shopId,
                    brandName: data.shop_name || '',
                    isFavorite: data.is_favorite === 'Y',
                    brandCont: data.shop_intro || ''
                });

                // 店铺SEO
                Object.assign(finalResult, searchHandler.getBrandShopSeo(channel, {
                    shopName: data.shop_name
                }, params));
            }
        } else {
            return Promise.reject('No ShopDecorator data');
        }

        // 获取商品数据和顶部筛选条件
        if (result[3].code === 200) {
            let info = result[3];
            let goodsList = _.get(info, 'data.product_list', []);

            if (goodsList.length) {
                let tip = {
                    start: (_.get(info, 'data.page', 1) - 1) * limitNum + 1,
                    total: _.get(info, 'data.total', 0)
                };

                tip.end = tip.start + limitNum - 1;
                if (tip.end > tip.total) {
                    tip.end = tip.total;
                }

                Object.assign(finalResult, {
                    filters: searchHandler.handleFilterDataAll(info.data, params),
                    opts: searchHandler.handleOptsData(params, tip.total),
                    goods: productProcess.processProductList(goodsList, {
                        newCoverSort: true,
                        showDiscount: false,
                        gender: _getGender(channel),
                        query: params.query
                    }),
                    footPager: {tip: tip}
                });

                _.set(finalResult, 'filters.checkedConditions.clearUrl',
                    `?navBar=${params.navBar}&shopId=${params.shopId}`);
            } else {
                finalResult.searchEmpty = true;

                if (result[5] && result[5].code === 200) {
                    let allGoods = {
                        name: '全部商品 ALL',
                        sort: searchHandler.handleOptsData(params, _.get(result[5], 'data.total', 0)),
                        list: productProcess.processProductList(_.get(result[5], 'data.product_list', []), {
                            newCoverSort: true,
                            showDiscount: false,
                            gender: gender
                        })
                    };

                    _.set(allGoods, 'sort.newPage', true); // 启用新的分页导航

                    finalResult.allGoods = allGoods;
                }
            }
        }

        if (result[4].code === 200) {
            let shopBrandIds = []; // 店铺下的所有品牌id数组

            _.forEach(_.get(result[4], 'data', []), value => {
                shopBrandIds.push(value.brand_id);
            });

            return searchApi.getSortList({brand: shopBrandIds}).then(subRes => {
                if (subRes.code === 200) {
                    let groupSort = _.get(subRes, 'data.sort', []),
                        noPageQs = Object.assign({}, params, {page: 1});

                    finalResult.leftContent = searchHandler.handleSortData(groupSort, noPageQs);

                    if (finalResult.allGoods) {
                        Object.assign(finalResult.allGoods, searchHandler.setShopSort(groupSort, noPageQs));
                    }
                }

                return finalResult;
            });

        }

        finalResult.criteo = {skn: searchHandler.getCriteo(_.get(finalResult, 'goods'))};

        return finalResult;
    });
};

/**
 * 获取基础模板店铺数据
 */
const getBaseShopData = (params, extra, channel, shopId) => {
    let resData = {};

    return Promise.all([
        getBrandData(params, extra, channel),
        searchApi.getShopDecorator(shopId), // 店铺装修数据
        searchApi.getShopInfo(shopId, extra.uid),
        shopApi.shopCouponListAsync(shopId) // 店铺优惠券数据
    ]).then(result => {
        let brand = result[0] || {};

        Object.assign(resData, brand);

        if (result[1].code === 200) {
            let data = result[1].data || {},
                decorator = shopHandler.getShopDecorator(data, {}, shopId, true);

            Object.assign(decorator.shopTopBannerBase, {
                shopId: shopId,
                bannerHeight: 150,
                shopHome: `/?shopId=${shopId}`,
                shopIntro: `/about?shopId=${shopId}`,
                coled: _.get(result[2], 'data.is_favorite', 'N') === 'Y'
            });

            _.set(resData, 'brand.shopBanner', decorator.shopTopBannerBase);
            _.unset(resData, 'brand.brandBanner');

            if (decorator.signboard) {
                _.unset(resData, 'brand.node');
                _.set(resData, 'brand.signboard', decorator.signboard);
            }
        }

        if (result[2].code === 200) {
            let shopName = _.get(result[2], 'data.shop_name', '');

            _.set(resData, 'brand.shopBanner.shopName', shopName);
            _.set(resData, 'brand.pathNav[2]', {
                name: shopName,
                pathTitle: shopName
            });

            // 店铺SEO
            Object.assign(resData, searchHandler.getBrandShopSeo(channel, {
                shopName: shopName
            }, params));
        }

        _.unset(resData, 'brand.coupon');
        if (result[3].data && !_.isEmpty(result[3].data)) {
            _.set(resData, 'brand.coupon',
                searchHandler.handleBrandShopCoupons(result[3].data, {shopId: shopId}));
        }

        // 临时删除seo信息
        _.unset(resData, 'title');
        _.unset(resData, 'keywords');
        _.unset(resData, 'description');

        return resData;
    });
};

const getUserCoupunStatus = (id, uid, type) => {
    if (type === 'shop') {
        return shopApi.shopCouponListAsync(id, uid).then(result => {
            if (result.data) {
                _.forEach(result.data, value => {
                    Object.assign(value, {
                        coupon_id: crypto.encryption('', `${value.coupon_id}`),
                        money: +value.money
                    });
                });
            }

            return result;
        });
    } else {
        return searchApi.getBrandCouponAsync(id, uid).then(result => {
            if (result.data) {
                result.data = _.get(result, 'data.coupons', []);
                _.forEach(result.data, value => {
                    Object.assign(value, {
                        coupon_id: crypto.encryption('', `${value.coupon_id}`),
                        money: +value.money
                    });
                });
            }

            return result;
        });
    }

};

module.exports = {
    getListData,
    getListNewData,
    getBrandInfo,
    getBrandData,
    getBrandAbout,
    getShopAbout,
    getNodeContentData,
    getAdnav,
    getShopInfo,
    getShopData,
    getShopGoodsData,
    getShopListData,
    getBaseShopData,
    getUserCoupunStatus
};