<?php


namespace App\Http\Services;

use App\Http\Controllers\Filter\SkuListFilter;
use App\Model\IntracodeModel;
use App\Model\RedisModel;
use Illuminate\Support\Facades\DB;

class SkuService
{
    //获取供应商列表需要统计的信息
    public function getSkuList()
    {
        $data['data']['goods_id'] = [];
        $filter = new SkuListFilter();
        $map = $filter->listFilter();
        $url = env('ES_SKU_URL', '');
        $map['show_status'] = 1;
        $return = curl($url, $map, 1);
        $data = json_decode($return, true);
        $list = [];
        if (isset($data['error_code']) && $data['error_code'] == 0) {
            $redis = new RedisModel;
            //处理供应商
            foreach ($data['data']['goods_id'] as $k => $goodsId) {
                $uploadItemService = new SkuUploadItemService();
                $auditData = $uploadItemService->getSkuAuditData($data['data']['goods_id']);
                if (empty($goodsId) || $goodsId == 0) {
                    continue;
                }
                $sku = json_decode($redis->hget('sku', $goodsId), true);
                //赋值
                $sku['goods_id'] = $goodsId;
                $sku['update_time'] = date('Y-m-d H:i:s', $sku['update_time']);
                $sku['status_name'] = Config('field.GoodsStatus')[$sku['goods_status']];
                if (!empty($auditData[$goodsId])) {
                    $sku['audit_time'] = date('Y-m-d H:i:s', $auditData[$goodsId]['audit_time']);
                    $sku['audit_user'] = $auditData[$goodsId]['audit_name'];
                }
                //添加sku是否过期
                $sku['is_expire'] = $data['data']['status'][$goodsId] && $data['data']['status'][$goodsId] > 0 ? 0 : 1;
                $spu = json_decode($redis->hget('spu', $sku['spu_id']), true);
                //型号处理
                if (empty($sku['goods_name']) && !empty($spu)) {
                    $sku['goods_name'] = $spu['spu_name'];
                }
                $sku['encap'] = array_get($spu, 'encap', '');
                //制造商处理
                if (empty($sku['brand_name']) && !empty($spu)) {
                    $brand = $redis->hget('brand_id', $spu['brand_id']);
                    if ($brand) {
                        $sku['brand_name'] = $brand;
                    } else {
                        $brand = DB::connection('spu')->table('brand')->where('brand_id',
                            $spu['brand_id'])->lists('brand_name', 'brand_id');
                        if ($brand) {
                            $sku['brand_name'] = $brand[$spu['brand_id']];
                        }
                    }
                }
                //获取价格
                $moqPrice = [];
                if (!empty($sku['ladder_price'])) {
                    $priceService = new PriceService();
                    $moqPrice = $priceService->getMoqPrice($sku['ladder_price']);
                }
                $sku['cn_price'] = array_get($moqPrice, 'price_cn');
                $sku['us_price'] = array_get($moqPrice, 'price_us');
                //获取是否精选和标签
                $goodsTag = $this->getGoodsTag($sku['goods_id']);
                $sku['goods_label'] = array_get($goodsTag, 'goods_label', '');
                $sku['goods_label_name'] = array_get(config('field.SkuGoodsLabel'), $sku['goods_label'], '');
                $sku['tags'] = array_get($goodsTag, 'tags', []);
                if (!empty($sku['tags'])) {
                    $sku['is_prefer'] = in_array(1, $sku['tags']) ? 1 : 0;
                } else {
                    $sku['is_prefer'] = 0;
                }
                $list[] = $sku;
            }
            $intraCodeModel = new IntracodeModel();
            $encodedList = array_column($list, 'encoded');
            $encodedUsers = $intraCodeModel->getEncodedUserByEncoded($encodedList);
            $list = array_map(function ($item) use ($encodedUsers) {
                $encoded = array_get($item, 'encoded', 0);
                $item['encoded_user_name'] = array_get($encodedUsers, $encoded, '');
                $item['moq'] = $item['moq'] ?: 0;
                $item['stock'] = $item['stock'] ?: 0;
                return $item;
            }, $list);
        }
        return [
            'list' => $list,
            'total' => !empty($data['data']['total']) ? $data['data']['total'] : 0
        ];
    }

    //设置精选
    public function setPreferSku($skuIds, $prefer)
    {
        //直接操作redis的goods_tag,然后推送es的修改任务即可
        $redis = new RedisModel();
        foreach ($skuIds as $skuId) {
            $goodsTag = $redis->hget('goods_tag', $skuId);
            $goodsTag = json_decode($goodsTag, true);
            if (!empty($goodsTag)) {
                $tag = array_get($goodsTag, 'tags', []);
                $tag = $tag ?: [];
                //判断是否有精选标签(1),而且操作是取消精选
                if ($prefer == -1) {
                    if (in_array(1, $tag)) {
                        $key = array_search(1, $tag);
                        if ($key !== false) {
                            unset($goodsTag['tags'][$key]);
                        }
                    }
                } else {
                    if (!in_array(1, $tag)) {
                        $tag[] = 1;
                        $goodsTag['tags'] = $tag;
                    }
                }
                $result = $redis->hset('goods_tag', $skuId, json_encode($goodsTag));
            } else {
                //没有直接跳过
                continue;
            }
            if ($result === false) {
                return false;
            }
            $redis->lpush('update_list_sku', $skuId);
        }
        return true;
    }

    private function getGoodsTag($skuId)
    {
        $redis = new RedisModel();
        $result = $redis->hget('goods_tag', $skuId);
        return $result ? json_decode($result, true) : [];
    }
}