<?php

namespace App\Modules\Admin\Services;

use App\Base\BaseService;
use App\Exceptions\ClientException;
use App\Models\Goods\Goods;
use App\Models\Goods\GoodsCategoryMap;
use App\Models\Goods\GoodsSku;
use App\Models\Goods\Spec;
use App\Models\Goods\SpecAttr;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;

class GoodsService extends BaseService
{
    public function paginate($params)
    {
        $p = Goods::query()->when($params['status'], function (Builder $query) use ($params) {
            return $query->where("status", $params['status']);
        })->when($params['name'], function (Builder $query) use ($params) {
            return $query->where("name", "like", "%{$params['name']}%");
        })->orderByDesc("id")->paginate($params['page_size']);

        return [
            "total" => $p->total(),
            "page_total" => $p->lastPage(),
            "list" => array_map(function (Goods $model) {

                return [
                    "id" => $model->id,
                    "name" => $model->name,
                    "thumb" => Arr::first($model->image_list),
                    "weight" => $model->weight,
                    "status" => $model->status,
                    "created_at" => $model->created_at->format("Y-m-d H:i:s"),
                ];
            }, $p->items()),
        ];
    }

    public function store($params)
    {
        if ($id = Arr::get($params, "id", 0)) {
            $goods = Goods::findOrFail($id);
        } else {
            $goods = new Goods();
        }

        $specIdArr = Arr::get($params, "spec", []);
        $notCustomSpecS = Spec::whereIn("id", $specIdArr)->where("is_custom", 0)->get();
        if ($notCustomSpecS->isEmpty()) {
            throw new ClientException("必须要存在一个非自定义的规格");
        }

        DB::transaction(function () use ($params, $goods, $specIdArr) {

            $goods->image_list = Arr::get($params, "image_list", []);
            $goods->spec = $specIdArr;
            $goods->name = Arr::get($params, "name", []);
            $goods->weight = Arr::get($params, "weight", 0);
            $goods->desc_html = Arr::get($params, "desc_html", "");
            $goods->spec_attr_html = Arr::get($params, "spec_attr_html", "");
            $goods->faq_html = Arr::get($params, "faq_html", "");
            $goods->save();
            $categoryArr = Arr::get($params, "category", []);
            GoodsCategoryMap::where("goods_id", $goods->id)->whereNotIn("category_id", Arr::pluck($categoryArr, "id"))->delete();
            foreach ($categoryArr as $c) {
                /**
                 * [
                 * "id" => 1
                 * "is_public" => 1
                 * ]
                 */
                GoodsCategoryMap::updateOrCreate([
                    "goods_id" => $goods->id,
                    "category_id" => $c['id'],
                    'is_public' => $c['is_public'],
                ]);
            }
            $skuArr = Arr::get($params, "sku", []);
            $doNotDelIdArr = [];
            foreach ($skuArr as $c) {
                /**
                 * [
                 * "id" => 0
                 * "sn" => "规格型号"
                 * "url_3d" => null
                 * "spec_attr" => array:2 [
                 * 0 => array:2 [
                 * "id" => 1
                 * "name" => "属性一"
                 * ]
                 * 1 => array:2 [
                 * "id" => 2
                 * "name" => "属性二"
                 * ]
                 * ]
                 * "is_use" => 1
                 * ]
                 */
                if ($id = Arr::get($c, "id")) {
                    $sku = GoodsSku::where("goods_id", $goods->id)->where("id", $id)->first();
                } else {
                    $sku = new GoodsSku();
                    $sku->goods_id = $goods->id;
                }
                $sku->sn = Arr::get($c, "sn", "");
                if (empty($sku->sn)) {
                    $sku->is_use = 0;
                }
                $sku->url_3d = Arr::get($c, "url_3d", "");
                $sku->spec_attr_list = Arr::get($c, "spec_attr", []);
                $sku->save();
                $doNotDelIdArr[] = $sku->id;
            }

            GoodsSku::where("goods_id", $goods->id)->whereNotIn("id", $doNotDelIdArr)->delete();
        });

    }

    public function info($params)
    {
        $id = $params['id'];
        $model = Goods::findOrFail($id);

        $return = [
            "id" => $model->id,
            "image_list" => $model->image_list,
            "category" => $model->map->map(function (GoodsCategoryMap $map) {
                return [
                    "id" => $map->category->id,
                    "is_public" => $map->is_public,
                ];
            }),
            "spec" => $model->spec,
            "sku" => $model->sku->map(function (GoodsSku $sku) {
                return [
                    "id" => $sku->id,
                    "sn" => $sku->sn,
                    "url_3d" => $sku->url_3d,
                    "is_use" => $sku->is_use,
                    "spec_attr" => array_map(function ($specAttrId) {
                        return [
                            "id" => $specAttrId,
                            "name" => SpecAttr::where("id", $specAttrId)->value("name"),
                        ];
                    }, $sku->spec_attr_list),
                ];
            }),
            "weight" => $model->weight,
            "desc_html" => $model->desc_html,
            "spec_attr_html" => $model->spec_attr_html,
            "faq_html" => $model->faq_html,
        ];

        return $return;
    }
}