<?php
namespace Product;

use LibModels\Wap\Guang\OptData;
use Product\SearchModel;
use LibModels\Web\Product\SearchData;
use LibModels\Web\Product\ShopData;
use Api\Yohobuy;
use WebPlugin\HelperSearch;
use LibModels\Web\Guang\ListData as GuangListData;
use WebPlugin\Helpers;

/**
 * 品牌店铺的模型
 *
 * @copyright yoho.inc
 * @author xiaoxiao.hao <xiaoxiao.hao@yoho.cn>
 */
class ShopModel
{
    private static $shopListUrl = '/shoplist';

    public static function getData($shopId, $parameters)
    {
        $data = array('shopTopBanner' => array(), 'hotSingle' => array());
        $parameters['shopId'] = $shopId;

        $shopList = ShopData::shopsDecoratorList($shopId);
        if (!empty($shopList['data']['list'])) {
            foreach ($shopList['data']['list'] as $list) {
                $fun = $list['resource_name'];
                if (is_callable("self::$fun")) {
                    $list = self::$fun(self::getResourceData($list, $shopId), $parameters);
                    switch ($fun) {
                        case 'signboard':
                            //过滤不合法的数据
                            break;
                        case 'newProducts':
                            $data['newArrivel']['name'] = '新品上架 NEW';
                            $data['newArrivel']['list'] = $list;
                            break;
                        case 'hotProducts':
                            $data['hotSingle']['name'] = '人气单品 HOT';
                            $data['hotSingle']['list'] = $list;
                            break;
                        case 'goodsTabBar':
                            if (isset($list['hot'])) {
                                $data['hotSingle']['navs'] = $list['hot'];
                            }
                            if ($list['new']) {
                                $data['newArrivel']['navs'] = $list['new'];
                            }
                            break;
                        default :
                            $data[$fun] = $list;
                    }
                }
            }
        } else {
            headers_sent() || header('Location: /error.html');
            exit();
        }

        //店铺介绍
        $data['brandIntro'] = self::getIntro($shopId, $parameters['uid']);

        //搜索店铺全部商品
        $searchCondition = SearchModel::searchCondition($parameters['condition'], $parameters['options']);

        // 组合搜索商品url
        $urlList['product'] = SearchData::getProductUrl($searchCondition['condition']);
        // 组合搜索分类url
        $sortCondition = array();
        $sortCondition['brand'] = self::getShopsBrandIds($shopId);

        if (isset($searchCondition['condition']['misort']) && !empty($searchCondition['condition']['misort'])) {
            $sortCondition['needSmallSort'] = 1;
        }
        $urlList['sort'] = SearchData::getClassesUrl($sortCondition);

        //批量调接口获取数据
        $res = Yohobuy::getMulti($urlList);

        //新品上架
        if (isset($parameters['navBar']) && $parameters['navBar'] * 1 === 3) {
            $searchCondition['options']['isNew'] = true;
        }

        // 组织模板数据
        $result = HelperSearch::getList($res, $searchCondition['options'], $searchCondition['userInput']);
        $data['pathNav'] = array_merge(
            HelperSearch::$listNav,
            array(
                array('href' => '', 'name' => $data['brandIntro']['brandName'], 'title' => $data['brandIntro']['brandName'])
            )
        );
        $sort = self::getSort($res['sort'], $parameters['options']['misort'], $shopId);
        $searchCondition['userInput'] = empty($searchCondition['userInput']) ? array() : $searchCondition['userInput'];
        $param = array_merge($searchCondition['userInput'], array('navBar' => 1, 'shopId' => $shopId));
        $data['allGoods']['list'] = $result['goods'];
        $data['allGoods']['name'] = '全部商品 ALL';
        $data['allGoods']['opts'] = $result['opts'];
        $data['leftContent'] = isset($result['leftContent']) ? $result['leftContent'] : '';
        $data['allGoods']['goodsMenu']['menuList'] = $sort;
        $data['allGoods']['goodsMenu']['url'] = self::$shopListUrl . '?' . http_build_query($param);
        $data['allGoods']['href'] = self::$shopListUrl . '?' . http_build_query($param);

        return $data;
    }


    /**
     * 店铺列表页
     */
    public static function getShopListData($shopId, $parameters)
    {
        $data = array('shopTopBanner' => array(), 'hotSingle' => array());
        $parameters['shopId'] = $shopId;

        $shopList = ShopData::shopsDecoratorList($shopId);

        if (isset($shopList['data']['list']) && $shopList['code'] === 200) {
            foreach ($shopList['data']['list'] as $list) {
                $fun = $list['resource_name'];
                if (is_callable("self::$fun")) {
                    $list = self::$fun(self::getResourceData($list, $shopId), $parameters);
                    switch ($fun) {
                        case 'newProducts':
                        case 'hotProducts':
                        case 'signboard':
                            break;
                        case 'goodsTabBar':
                            if (isset($list['hot'])) {
                                $data['hotSingle']['navs'] = $list['hot'];
                            } else if ($list['new']) {
                                $data['newArrivel']['navs'] = $list['new'];
                            }
                            break;
                        default :
                            $data[$fun] = $list;
                    }
                }
            }
        }

        //店铺介绍
        $data['brandIntro'] = self::getIntro($shopId, $parameters['uid']);


        //搜索店铺全部商品
        $searchCondition = SearchModel::searchCondition($parameters['condition'], $parameters['options']);

        // 组合搜索商品url
        $urlList['product'] = SearchData::getProductUrl($searchCondition['condition']);
        // 组合搜索分类url
        $sortCondition = array();
        $sortCondition['brand'] = self::getShopsBrandIds($shopId);
        if (isset($searchCondition['condition']['misort']) && !empty($searchCondition['condition']['misort'])) {
            $sortCondition['needSmallSort'] = 1;
        }
        $urlList['sort'] = SearchData::getClassesUrl($sortCondition);

        //批量调接口获取数据
        $res = Yohobuy::getMulti($urlList);

        //新品上架
        if (isset($parameters['navBar']) && $parameters['navBar'] * 1 === 3) {
            $searchCondition['options']['isNew'] = true;
        }

        // 组织模板数据
        $result = HelperSearch::getList($res, $searchCondition['options'], $searchCondition['userInput']);

        $data['goods'] = $result['goods'];
        $data['opts'] = $result['opts'];
        $data['totalCount'] = $result['totalCount'];//商品总数
        $data['leftContent'] = isset($result['leftContent']) ? $result['leftContent'] : '';
        $data['filters'] = $result['filters'];
        $data['pathNav'] = array_merge(
            $result['pathNav'],
            array(
                array('href' => '', 'name' => $data['brandIntro']['brandName'], 'title' => $data['brandIntro']['brandName'])
            )
        );
//        $data['name'] = '全部商品 ALL';
//        $sort = self::getSort($res['sort']);
//        $data['goodsMenu']['menuList'] = $sort;

        return $data;

    }


    //异步获取全部商品goods数据
    public static function getGoods($condition, $options)
    {
        //搜索店铺全部商品
        $searchCondition = SearchModel::searchCondition($condition, $options);

        // 组合搜索商品url
        $urlList['product'] = SearchData::getProductUrl($searchCondition['condition']);
        // 组合搜索分类url
        $sortCondition = array();
        $sortCondition['brand'] = self::getShopsBrandIds($condition['shop']);
        if (isset($searchCondition['condition']['misort']) && !empty($searchCondition['condition']['misort'])) {
            $sortCondition['needSmallSort'] = 1;
        }
        $urlList['sort'] = SearchData::getClassesUrl($sortCondition);

        //批量调接口获取数据
        $res = Yohobuy::getMulti($urlList);

        // 组织模板数据
        $result = HelperSearch::getList($res, $searchCondition['options'], $searchCondition['userInput']);

        $sort = self::getSort($res['sort'], $options['misort'], $condition['shop']);
        $data['goodsMenu']['menuList'] = $sort;
        $data['list'] = $result['goods'];
        $data['opts'] = $result['opts'];

        return $data;
    }


    /**
     * 店铺-经典Banner 资源位
     * @param type $data []
     */
    public static function shopTopBanner($data)
    {
        $result = array(
            'banner' => '',
            'isShowShopName' => false,
            'bannerHeight' => 150
        );

        if (!empty($data['resource_data'][0]['shopSrc'])) {
            $result['banner'] = self::imageView2($data['resource_data'][0]['shopSrc'], 1150, 150);
        }

        if (!empty($data['resource_data'][0]['detailSrc'])) {
            $result['detailSrc'] = self::imageView2($data['resource_data'][0]['detailSrc'], 1150, 150);
        }

        if (!empty($data['resource_data'][0]['isShowShopName'])) {
            $result['isShowShopName'] = $data['resource_data'][0]['isShowShopName'] === 'Y';
        }
        return $result;

    }

    /**
     * 店铺-基础Banner 资源位
     * @param type $data
     * @return type []
     */
    public static function shopTopBanner_base($data)
    {
        $result = array(
            'banner' => '',
            'isShowShopName' => false,
            'bannerHeight' => 150
        );

        if (!empty($data['resource_data'][0]['shopSrc'])) {
            $result['banner'] = $data['resource_data'][0]['shopSrc'];
        }

        if (!empty($data['resource_data'][0]['detailSrc'])) {
            $result['detailSrc'] = $data['resource_data'][0]['detailSrc'];
        }

        if (!empty($data['resource_data'][0]['isShowShopName'])) {
            $result['isShowShopName'] = $data['resource_data'][0]['isShowShopName'] === 'Y';
        }

        return $result;

    }

    /**
     * 导航栏 资源位
     * @param type $data
     * @return type []
     */
    public static function navigationBar($data, $parameters = array())
    {
        $shopNav = array(
            array(
                'name' => '店铺首页',
                'url' => '/?navBar=0&shopId=' . $parameters['shopId'],
            ),
            array(
                'name' => '全部商品',
                'url' => self::$shopListUrl . '?navBar=1&shopId=' . $parameters['shopId'],
                'arrow' => true,
            ),
            array(
                'name' => '人气单品',
                'url' => self::$shopListUrl . '?navBar=2&order=s_n_desc&shopId=' . $parameters['shopId'],
            ),
            array(
                'name' => '新品上架',
                'url' => self::$shopListUrl . '?navBar=3&order=s_t_desc&shopId=' . $parameters['shopId'],
            ),
        );

        if (isset($data['resource_data']) && is_array($data['resource_data'])) {
            $shopNav = array_merge($shopNav, array_filter($data['resource_data'], function ($v) {
                if (empty($v['url'])) {
                    return false;
                }
                return $v;
            }));
        }

        //选中状态
        if (isset($parameters['navBar']) && count($shopNav) >= $parameters['navBar'] && $parameters['navBar'] >= 0) {
            $shopNav[$parameters['navBar']]['current'] = true;
        } else {
            $shopNav[0]['current'] = true;
        }

        return $shopNav;
    }

    /**
     * 资源位小图
     * @param type $data
     */
    public static function oneRowTwoColImages($data)
    {
        $oneData = array();
        $twoData = array();

        foreach ($data['resource_data'] as $resource) {

            if (empty($resource['data'])) {
                continue;
            }

            foreach ($resource['data'] as $key => $val) {

                $temp = array(
                    'img' => self::imageView2($val['src'], 300, 175),
                    'url' => Helpers::getUrlSafe($val['url']),
                );

                if ($key === 0) {
                    $oneData[] = $temp;
                } else {
                    $twoData[] = $temp;
                }
            }
        }

        return array_slice(array_merge($oneData, $twoData), 0, 2);
    }

    /**
     * 资源位大图
     * @param type $data
     * @return type []
     */
    public static function largeSlideImg($data)
    {
        $result = array();

        foreach ($data['resource_data'] as $resource) {

            if (empty($resource['data'])) {
                continue;
            }

            foreach ($resource['data'] as $val) {
                $result[] = array(
                    'img' => self::imageView2($val['src'], 660, 360),
                    'url' => Helpers::getUrlSafe($val['url']),
                );
            }
        }

        return $result;
    }

    /**
     * 经典推荐
     * @param type $data
     * @return type []
     */
    public static function recommend($data)
    {
        $result = array();

        foreach ($data['resource_data'] as $resource) {
            $result[] = array(
                'enName' => Helpers::isChinese($resource['enName']) ?
                    Helpers::substrEllipsis($resource['enName'], 5) : Helpers::substrEllipsis($resource['enName'], 10),
                'name' => Helpers::isChinese($resource['name']) ?
                    Helpers::substrEllipsis($resource['name'], 5) : Helpers::substrEllipsis($resource['name'], 6),
                'img' => self::imageView2($resource['src'], 50, 50),
                'title' => $resource['title'],
                'url' => Helpers::getUrlSafe($resource['url']),
            );
        }
        if (empty($result)) {
            return $result;
        }

        return array(
            'title' => isset($result[0]['title']) ? $result[0]['title'] : '经典推荐',
            'list' => $result
        );
    }

    /**
     * 热门推荐
     * @param type $data
     * @return type []
     */
    public static function hotRecommend($data)
    {
        $result = array();

        foreach ($data['resource_data'] as $resource) {
            $result[] = array(
                'img' => self::imageView2($resource['src'], 160, 240),
                'title' => $resource['title'],
                'url' => Helpers::getUrlSafe($resource['url']),
            );
        }
        if (empty($result)) {
            return $result;
        }

        return array(
            'title' => isset($result[0]['title']) ? $result[0]['title'] : '热销推荐',
            'list' => $result
        );
    }

    /**
     * 水牌
     * @param type $data
     * @return type []
     */
    public static function signboard($data)
    {
        $result = array();
        foreach ($data['resource_data'] as $resource) {
            if (empty($resource['data'])) {
                continue;
            }

            foreach ($resource['data'] as $val) {
                $result[] = array(
                    'img' => self::imageView2($val['src'], 160, 240),
                    'url' => Helpers::getUrlSafe($val['url']),
                );
            }
        }

        return array(
            'title' => empty($result[0]['title']) ? '' : $result[0]['title'],
            'list' => $result
        );
    }

    /**
     *    品牌一览
     * @param type $data
     * @return type []
     */
    public static function brandBrowse($data, $parameters = array())
    {
        $result = array();
        $brand = isset($parameters['brand']) ? $parameters['brand'] : '';
        if (count($data['resource_data']) <= 1) {
            return $result;
        }

        foreach ($data['resource_data'] as $resource) {
            $result[] = array(
                'url' => Helpers::url(
                    self::$shopListUrl,
                    array(
                        'shopId' => $parameters['shopId'],
                        'brand' => $resource['id'],
                        'navBar' => 1
                    ),
                    ''
                ),
                'brandName' => $resource['brandName'],
                'cur' => ($brand === strval($resource['id']))
            );
        }

        return array('title' => '品牌集合', 'list' => $result);
    }

    /**
     * 商品标签栏
     * @param type $data
     * @return type []
     */
    public static function goodsTabBar($data, $parameters)
    {
        $more = array(
            'name' => 'MORE',
            'href' => self::$shopListUrl . '?shopId=' . $parameters['shopId']
        );
        $result = array(
            'hot' => array(),
            'new' => array()
        );
        if (empty($data['resource_data'])) {
            return $result;
        }

        if (isset($data['resource_data']['hot'])) {
            foreach ($data['resource_data']['hot'] as $val) {
                if (empty($val['url'])) {
                    continue;
                }
                $result['hot'][] = array(
                    'name' => $val['name'],
                    'href' => Helpers::getUrlSafe($val['url']),
                );
            }
        }

        if (isset($data['resource_data']['new'])) {
            foreach ($data['resource_data']['new'] as $val) {
                if (empty($val['url'])) {
                    continue;
                }
                $result['new'][] = array(
                    'name' => $val['name'],
                    'href' => Helpers::getUrlSafe($val['url']),
                );
            }
        }

        $result['hot'][] = $more;
        $result['new'][] = $more;
        return $result;
    }

    /**
     * 新品上架
     * @param type $data
     * @return type []
     */
    public static function newProducts($data, $opts)
    {
        $result = array();

        foreach ($data['resource_data'] as $resource) {
            $result[] = array(
                'productId' => $resource['productId'],
                'title' => $resource['productName'],
                'productSkn' => $resource['productSkn'],
                'price' => '¥' . number_format(trim($resource['salesPrice'], '¥'), 2, '.', ''),
                'img' => self::imageView2($resource['src'], 250, 340),
                'url' => Helpers::getProductUrl($resource['productId'], $resource['productSkn'], $resource['productName']),
            );
        }
        return $result;
    }

    /**
     * 人气单品
     * @param type $data
     * @return type []
     */
    public static function hotProducts($data, $opts)
    {
        $result = array();

        foreach ($data['resource_data'] as $key => $resource) {
            $result[] = array(
                'productId' => $resource['productId'],
                'title' => $resource['productName'],
                'productSkn' => $resource['productSkn'],
                'price' => '¥' . number_format(trim($resource['salesPrice'], '¥'), 2, '.', ''),
                'img' => self::imageView2($resource['src'], 250, 340),
                'url' => Helpers::getProductUrl($resource['productId'], $resource['productSkn'], $resource['productName']),
                'index' => $key + 1
            );
        }

        return $result;
    }

    /**
     * 基础模板
     * @param type int $shopId 店铺id
     * @return type []
     */
    public static function basisTemplate($shopId)
    {
        $data = array('signboard' => array());
        $parameters['shopId'] = $shopId;
        $shopList = ShopData::shopsDecoratorList($shopId);
        if (!empty($shopList['data']['list'])) {
            foreach ($shopList['data']['list'] as $list) {
                $fun = $list['resource_name'];
                if (is_callable("self::$fun")) {
                    $list = self::$fun(self::getResourceData($list, $shopId), $parameters);
                    switch ($fun) {
                        case 'shopTopBanner_base':
                        case 'signboard':
                            $data[$fun] = $list;
                            break;
                    }
                }
            }
        }
        return $data;
    }

    /**
     * 潮流资讯
     * @param type string $tag 搜索内容
     * @return array []
     */
    public static function getArticle($shopId)
    {
        $result = array();
        $articleData = array();
        $brands = self::getShopsBrands($shopId);
        if (empty($brands)) {
            return $result;
        }
        foreach ($brands as $val) {
            $article = GuangListData::getArticleByBrand($val['brand_id'], 3);
            if (!empty($article['data'])) {
                $articleData = array_merge($articleData, $article['data']);
            }

            if (count($articleData) > 3) {
                break;
            }
        }

        if (empty($articleData)) {
            return $result;
        }

        foreach ($articleData as $key => $artList) {
            if ($key >= 3) {
                break;
            }
            $result['trendList'][] = array(
                'href' => $artList['url'],
                'src' => self::imageView2(substr($artList['src'], 0, strpos($artList['src'], '?')), 264, 173),
                'mainTitle' => $artList['title'],
                'Subtitle' => $artList['intro']
            );
        }
        //等于3个才显示
        if (count($result['trendList']) < 3) {
            return array();
        }

        $result['name'] = '潮流资讯 HOT ITEMS';

        return $result;
    }

    /**
     * 缩略图
     * @param type $src 图片路径
     * @param type $width 宽
     * @param type $heigh 高
     * @return type string src
     */
    public static function imageView2($src, $width, $heigh)
    {
        $src .= strstr($src, '?') ? '&' : '?';

        return Helpers::getUrlSafe("{$src}imageView2/1/w/{$width}/h/{$heigh}");
    }

    private static function modifyUrl($val, $shopId)
    {
        if (isset($val['linkType']) && $val['linkType'] == 1) {
            return Helpers::url('/product/index/shoplist', array('filter_poolId' => $val['categoryId'], 'shopId' => $shopId), '');
        } else {
            return $val['url'];
        }
    }

    /**
     * 解析resource_data 参数
     * @param type $data
     * @return type []
     */
    public static function getResourceData($data, $shopId)
    {
        $result = isset($data['resource_data']) ? json_decode($data['resource_data'], true) : array();
        foreach ($result as $key => &$val) {
            $val['url'] = self::modifyUrl($val, $shopId);

            if (isset($val['data']) && is_array($val['data'])) {
                foreach ($val['data'] as $k => &$v) {
                    $url = self::modifyUrl($v, $shopId);
                    if (!empty($url)) {
                        $v['url'] = $url;
                    }

                }
            }

            if (!iseet($val['data']) && is_array($val)) {
                foreach ($val as $k1 => &$v1) {
                    $url = self::modifyUrl($v1, $shopId);
                    if (!empty($url)) {
                        $v1['url'] = $url;
                    }
                }
            }
        }

        $data['resource_data'] = $result;
        return $data;
    }

    public static function shopsDecoratorList($shopId)
    {
        return ShopData::shopsDecoratorList($shopId);
    }

    public static function getIntro($shopId, $uid)
    {
        $data = array(
            'brandName' => '',
            'brandCont' => '',
            'domain' => '',
            'logo' => '',
            'isFavorite' => false,
            'multBrandShopType' => 0,
            'shopTemplateType' => 0,
            'showShopName' => false
        );

        $intro = ShopData::getIntro($shopId, $uid);

        if (!empty($intro['data'])) {
            $data = array(
                'brandName' => $intro['data']['shop_name'],
                'brandCont' => $intro['data']['shop_intro'],
                'domain' => $intro['data']['shop_domain'],
                'logo' => $intro['data']['shop_logo'],
                'isFavorite' => ($intro['data']['is_favorite'] === 'Y'),
                'shopTemplateType' => intval($intro['data']['shop_template_type']),
                'multBrandShopType' => intval($intro['data']['mult_brand_shop_type']),
                'showShopName' => ($intro['data']['is_show_shop_name'] === 'Y')
            );
        }

        $data['shopId'] = $shopId;
        return $data;
    }


    //获取二级品类(按库存排名取前15个二级品类)
    public static function getSort($sort, $misort, $shopId)
    {
        $result = array();
        $i = 0;
        if (empty($sort['sort'])) {
            return $result;
        }
        foreach ($sort['sort'] as $key => $value) {
            foreach ($value['sub'] as $k => $v) {
                $result[$i]['href'] = '/?msort=' . $value['sort_id'] . '&misort=' . $v['sort_id'] . '&shopId=' . $shopId;
                $result[$i]['name'] = $v['sort_name'];
                $result[$i]['count'] = $v['count'];
                $result[$i]['orderBy'] = $v['order_by'];
                $result[$i]['misort'] = $v['sort_id'];
                $i++;
            }
        }
        foreach ($result as $key => $value) {
            $count[$key] = $value['count'];
            $sortName[$key] = $value['name'];
        }

        $arr = array();
        array_multisort($count, SORT_DESC, $sortName, $result);
        $result = array_slice($result, 0, 15);

        foreach ($result as &$value) {
            if ($value['misort'] == $misort) {
                $value['curMenu'] = true;
            }
        }

        return $result;
    }

    /**
     * 获取店铺下的品牌
     * @param type $shopId 店铺id
     * @return type []
     */
    public static function getShopsBrands($shopId)
    {
        $result = ShopData::getShopsBrands($shopId);
        return empty($result['data']) ? array() : $result['data'];
    }

    /**
     * 获取店铺下的品牌id
     * @param type $shopId 店铺id
     * @return array []
     */
    public static function getShopsBrandIds($shopId)
    {
        $brands = array();
        $result = self::getShopsBrands($shopId);
        if (!empty($result)) {
            foreach ($result as $val) {
                $brands[] = $val['brand_id'];
            }
        }

        return implode(',', $brands);
    }

    public static function getSearch($shopId)
    {
        return ShopData::getSearch($shopId);
    }

    public static function getSortInfo($shopId, $yhChannel = '', $gender = '')
    {
        return ShopData::getSortInfo($shopId, $yhChannel, $gender);
    }

    public static function setFavorite($shopId, $isfavorite, $uid, $type = 'shop')
    {
        return ShopData::setFavorite($shopId, $isfavorite, $uid, $type);
    }

    public static function byDomain($domain)
    {
        $data = array('shop_id' => '', 'type' => '');

        $result = ShopData::byDomain($domain);

        if (!empty($result['data'])) {
            $data = $result['data'];
        }

        return ShopData::byDomain($domain);
    }
}