<?php

namespace App\Admin\Controllers;

use App\Command\Log;
use App\Models\Good;
use App\Models\GoodSku;
use App\Models\Category;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Widgets\Card;
use Dcat\Admin\Widgets\Modal;
use Illuminate\Support\Facades\DB;
use App\Admin\Renderable\RenderGoodSku;
use App\Admin\Repositories\GoodSku as SkuRepos;
use Illuminate\Http\Request;

class GoodController extends AdminController
{
    /**
     * Make a grid builder.
     *
     * @return Grid
     */
    protected function grid()
    {
        return Grid::make(new Good(), function (Grid $grid) {
            $grid->model()->orderBy('created_at', 'DESC');
            $grid->column('id')->sortable();
            $grid->column('goods_sn', '商品编号')->width(80);
            $grid->column('goods_name')->limit(15)->width(250);
            $grid->column('cover_img', '商品图片')->image('', 100, 100);
            $grid->column('sku', '规格信息')->expand(function (Grid\Displayers\Expand $expand) {
                $expand->button('查看');
                return RenderGoodSku::make(['goods_id' => $this->id]);
            });
            $grid->column('goods_desc', '内容详情')->if(function ($column) {
                return $column->getValue();
            })->display('点击查看')->modal(function ($modal) {
                //设置弹窗标题
                $modal->title('内容详情');

                $card = new Card(null, $this->goods_desc);

                return "<div style='padding:10px 10px 0;width:100%;overflow:auto;'>$card</div>";
            })->else(function ($column) {
                return '';
            });
            $grid->column('intro_desc', '购买须知')->if(function ($column) {
                return $column->getValue();
            })->display('点击查看')->modal(function ($modal) {
                //设置弹窗标题
                $modal->title('内容详情');

                $card = new Card(null, $this->intro_desc);

                return "<div style='padding:10px 10px 0;width:100%;'>$card</div>";
            })->else(function ($column) {
                return '';
            });

            $grid->column('commission', '分佣比例')->display('点击查看')->modal(function ($modal) {
                $modal->title('分佣比例详情');
                $content = "<strong>直推返积分比例:</strong> {$this->first_commission}%<br/>";
                $content .= "<strong>间推返积分比例:</strong> {$this->second_commission}%<br/>";
                $content .= "<strong>商家佣金比例:</strong> {$this->merchant_commission}%";
                
                $card = new Card(null, $content);
                return "<div style='padding:10px 10px 0;width:100%;'>$card</div>";
            });

            $grid->column('sort', '排序');

            $grid->column('is_hot', '是否推荐')->display(function ($val) {
                return ($val == 1) ? '是' : '否';
            });
            $grid->column('goods_type', '是否代购')->display(function ($val) {
                return ($val == 1) ? '是' : '否';
            });
            $grid->column('is_show', '状态')->switch('', true);
            //$grid->column('updated_at')->sortable();

            $grid->disableViewButton();
            $grid->actions(function (Grid\Displayers\Actions $actions) {
                // 假设我们根据模型的 status 字段来控制编辑按钮的显示
                if ($actions->row->is_show == 1) {
                    //则不显示编辑按钮
                    $actions->disableEdit();
                }
            });

            $grid->filter(function (Grid\Filter $filter) {
                // 更改为 panel 布局
                $filter->panel();
                $filter->like('goods_name')->width(3);
                $filter->equal('is_hot', '是否推荐')->select(['1' => '是', '0' => '否'])->width(3);
                $filter->equal('is_show', '上架状态')->select(['1' => '是', '0' => '否'])->width(3);
            });
        });
    }

    /**
     * Make a show builder.
     *
     * @param mixed $id
     *
     * @return Show
     */
    protected function detail($id)
    {
        return Show::make($id, Good::with(['category']), function (Show $show) {
            $show->field('id');
            $show->field('goods_name');
            $show->field('category.title', '分类名称');
            $show->field('product_no');
            $show->field('material');
            $show->field('product_no');
            $show->field('box_size');
            $show->relation('gattr', function ($model) {
                $grid = new Grid(new SkuRepos());

                $grid->model()->where('goods_id', $model->id);
                // 设置路由
                $grid->setResource('gattr');

                $grid->id();
                $grid->content()->limit(10);
                $grid->attr_val();
                $grid->attr_sn();
                $grid->created_at();
                $grid->updated_at();

                // $grid->filter(function ($filter) {
                //     $filter->like('content')->width('300px');
                // });

                return $grid;
            });

            $show->field('created_at');
            $show->field('updated_at');
        });
    }

    /**
     * Make a form builder.
     *
     * @return Form
     */
    protected function form()
    {
        $form = Form::make(new Good(), function (Form $form) {
            $form->display('id');
            $form->tab('基本信息', function (Form $form) {
                $form->text('goods_name', '商品名称')->required();
                $form->text('goods_sn', '商品编号');
                $form->text('first_commission', '直推返积分比例')->help("比例如:30");
                $form->text('second_commission', '间推返积分比例')->help("比例如:15");
                $form->text('merchant_commission', '商家佣金比例')->help("比例如:10");
                $form->text('sale', '销量');
                $form->text('high_opinion', '好评率');
                $form->image('cover_img')
                    ->url('upload/goods')
                    ->deleteUrl('upload/delete-public-oss-file')
                    ->autoUpload()->help("仅支持jpg、jpeg、png格式图片上传,尺寸大小 280px * 280px");
                // $form->image('cover_img')
                //     ->accept('jpg,jpeg,png')
                //     ->maxSize(4096)
                //     ->url('upload/goods')
                //     ->help('仅支持jpg、jpeg、png格式图片上传(320px * 320px)')
                //     ->autoUpload();
                // $form->multipleImage('carousel', '产品图')
                //     ->accept('jpg,jpeg,png')
                //     ->maxSize(51200)
                //     ->url('upload/goods')
                //     ->help('仅支持jpg、jpeg、png格式图片上传(尺寸 750px*750px)')
                //     ->limit(5)
                //     ->autoUpload()->saveAsJson();
                $form->multipleImage('carousel', '轮播图')
                    ->accept('jpg,jpeg,png')
                    ->maxSize(51200)
                    ->url('upload/goods')
                    ->help('仅支持jpg、jpeg、png格式图片上传,尺寸大小 750px * 600px')
                    ->limit(9)
                    ->autoUpload()->saveAsJson();
                $form->switch('is_show', '上架状态')->default(1);
                $form->switch('goods_type', '是否代购产品')->default(0);
                $form->switch('is_hot', '是否推荐')->default(0);
                $form->text('sort', '排序')->default(0)->help('越大越靠前');
                $form->disableCreatingCheck();
                $form->disableEditingCheck();
                $form->disableViewCheck();
                $form->disableDeleteButton();
                $form->disableViewButton();
            })->tab('规格', function (Form $form) {
                $sku = $form->model()->sku;
                //$str = '{"attrs":{"颜色":["红色","蓝色"],"大小":["20"]},"sku":[{"颜色":"红色","大小":"20","pic":"图片","stock":"106","price":"100","column1":"5","column2":""},{"颜色":"蓝色","大小":"20","pic":"","stock":"89","price":"90","column1":"51","column2":""}]}';
                $sku_params = [
                    [
                        'name'    => '库存', // table 第一行 title 
                        'field'   => 'stock', // input 的 field_name 名称
                        'default' => '', // 默认值
                    ],
                ];

                $form->sku('sku', json_encode($sku_params))->display(true)->customFormat(function ($value) use ($form, $sku) {

                    return $sku;
                })->required();
            })->tab('文字标签', function (Form $form) {
                $fieldArr = [
                    'field1' => '',
                    'field2' => '',
                    'field3' => '',
                    'field4' => '',
                    'field5' => '',
                ];
                $form->keyValue('tags', '标签')
                    ->setKeyLabel('键 (field开头拼上数字,商品列表页filed1-10,商品详情页field11-30)')
                    ->setValueLabel('值')->saving(function ($v) {
                        // 转化为json格式存储
                        return json_encode($v);
                    });
                //->disableCreateButton();
                //->disableDelete();
            })->tab('详情', function (Form $form) {

                $form->editor('goods_desc');
            })->tab('购买须知', function (Form $form) {

                $form->editor('intro_desc');
            });
        });

        //副表保存规格
        $form->saved(function (Form $form, $result) {
            $goods_id = $form->getKey();
            //是否操作规格数据(编辑时)
            $skuexist = GoodSku::where("goods_id", $goods_id)->count();
            //Log::add('规格数据', $skuArr);
            if (isset($_POST['sku'])) {
                $skuStr = $_POST['sku'];
                $skuArr = json_decode($skuStr, true);
                $attrs = isset($skuArr['attrs']) ? $skuArr['attrs'] : [];
                $attrsKey = $attrs ? array_keys($attrs) : [];
                if ($skuexist == 0) { //新增
                    $skuArr['sku'] = self::addGoodSkuData($attrsKey, $skuArr['sku'], $goods_id);
                } else {
                    //编辑
                    $skuArr['sku'] = self::editGoodSkuData($attrsKey, $skuArr['sku'], $goods_id);
                }
                $skuCon = json_encode($skuArr, JSON_UNESCAPED_UNICODE);
                DB::table('li_goods')->where("id", $goods_id)->update(['sku' => $skuCon]);
            }
            if (isset($_POST['is_show']) && $_POST['is_show'] == 0) {
                DB::table('li_user_collect')->where('goods_id', $goods_id)->update(['deleted_at' => DB::raw('CURRENT_TIMESTAMP')]);
            }
        });
        $form->submitted(function (Form $form) {
            $goods_id = $form->getKey();
            $is_show = isset($_POST['is_show']) ? $_POST['is_show'] : 0;
            $skuStr = isset($_POST['sku']) ? $_POST['sku'] : '';
            $skuArr = json_decode($skuStr, true);
            $skuVal = isset($skuArr['sku']) ? $skuArr['sku'] : [];
            if (isset($_POST['sku']) && !$skuVal && $is_show) {
                $form->responseValidationMessages('sku', "商品规格不为空");
            }
        });
        return $form;
    }
    public static function addGoodSkuData($attrsKey, $sku, $gid)
    {
        foreach ($sku as $kk => $vv) {
            $attr_name = [];
            foreach ($attrsKey as $val) {
                array_push($attr_name, $vv[$val]);
            }
            utf8_array_asort($attr_name);
            $attr_val = join("、", $attr_name);
            $attr_sn =  md5($attr_val);
            $goodSkuObj = new GoodSku();
            $goodSkuObj->goods_id = $gid;
            $goodSkuObj->attr_val = $attr_val;
            $goodSkuObj->attr_sn = $attr_sn;
            $goodSkuObj->market_price = $vv['market_price'];
            $goodSkuObj->cg_price = $vv['cg_price'];
            $goodSkuObj->stock = $vv['stock'];
            $goodSkuObj->pic = $vv['pic'];
            $goodSkuObj->save();
            //规格标识
            $sku[$kk]['attr_sn'] = $attr_sn;
        }
        return $sku;
    }
    public static function editGoodSkuData($attrsKey, $sku, $gid)
    {
        $existAttrSn = []; //规格数组
        $editAttrSn = []; //已编辑存在的规格
        $glist = GoodSku::where("goods_id", $gid)->get()->toArray();
        foreach ($glist as $key => $val) {
            array_push($existAttrSn, $val['attr_sn']);
        }

        foreach ($sku as $kk => $vv) {
            $attr_name = [];
            foreach ($attrsKey as $val) {
                array_push($attr_name, $vv[$val]);
            }
            utf8_array_asort($attr_name);
            $attr_val = join("、", $attr_name);
            $attr_sn = md5($attr_val);
            if (in_array($attr_sn, $existAttrSn)) {
                $goodSkuObj = GoodSku::where(['attr_sn' => $attr_sn, 'goods_id' => $gid])->first();
                $editAttrSn[] = $attr_sn;
            } else {
                $goodSkuObj = new GoodSku();
                $goodSkuObj->goods_id = $gid;
            }
            $goodSkuObj->attr_val = $attr_val;
            $goodSkuObj->pic = str_replace(env('IMAGE_URL'), '', $vv['pic']);
            $goodSkuObj->attr_sn = $attr_sn;
            $goodSkuObj->market_price = $vv['market_price'];
            $goodSkuObj->cg_price = $vv['cg_price'];
            $goodSkuObj->stock = $vv['stock'];
            $goodSkuObj->save();

            //规格标识
            $sku[$kk]['attr_sn'] = $attr_sn;
        }
        //取数组差集
        $noAttrSn = array_diff($existAttrSn, $editAttrSn);
        if ($noAttrSn) {
            foreach ($noAttrSn as $k => $v) {
                DB::table('li_goods_sku')->where(['goods_id' => $gid, 'attr_sn' => $v])->delete();
            }
            //清除商家商品记录
            DB::table('merchant_store_sku')->where(['goods_id' => $gid])->delete();
        }

        return $sku;
    }
}