<?php
/**
+-----------------------------------------------------------------------------------------------------------------------
 * Steps 表单: GiftCard Step Form-分类
+-----------------------------------------------------------------------------------------------------------------------
 * PHP version 7
 *
 * @category  App\Admin\Forms\Steps\GiftCard
 * @package   App\Admin\Forms\Steps\GiftCard
 * @author    Richer <yangzi1028@163.com>
 * @date      2022年5月7日15:14:47
 * @copyright 2020-2022 Richer (http://www.Richer.com/)
 * @license   http://www.Richer.com/ License
 * @link      http://www.Richer.com/
 */
namespace App\Admin\Forms\Steps\GiftCard;

use App\Admin\Traits\FormFieldTrait;
use App\Models\GiftCard\GiftCard;
use App\Models\GiftCard\GiftCardCategory;
use App\Admin\Rewrite\Widgets\StepForm;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Form\NestedForm;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

/**
 * Class Sku
 *
 * @category  App\Admin\Forms\Steps\GiftCard
 * @package   App\Admin\Forms\Steps\GiftCard
 * @author    Richer <yangzi1028@163.com>
 * @date      2022年5月7日15:14:47
 * @copyright 2020-2022 Richer (http://www.Richer.com/)
 * @license   http://www.Richer.com/ License
 * @link      http://www.Richer.com/
 */
class Sku extends StepForm
{
    use FormFieldTrait;
    /**
     * The form title.
     *
     * @var string
     */
    public $title = 'Sku信息';

    /**
     * The form.
     *
     * @var string
     */
    public $form = null;

    public $suffix = 'gift-card';

    /**
     * Other constructor.
     * @param array $data
     */
    public function __construct($data = [])
    {
        $this->model = new GiftCard();

        $this->form = $this;

        parent::__construct($data);
    }

    /**
     * The form title.
     *
     * @var string
     */
    public $model = null;

    /**
     * Handle the form request.
     *
     * @param Request $request
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request)
    {
        session()->put("steps.gift-card.model", $this->model);
        $basic = $this->save($request);
        admin_toastr('规格维护成功,请维护其他信息!');
        return $this->next($basic);
    }

    /**
     * Build a form here.
     */
    public function form()
    {
        Admin::script(' $(".step-submit").on("click", function() {$(this).text("Loading...").addClass("disabled");});');

//        dump(\request()->all());
        $id = $this->getId() ;
        if ($id) {
            $this->hidden('id')->default($this->getId());
        }

        $model = $this->model->with(['skus','specification','specificationItems.attribute.values'])->find($id);

        $skus       = optional($model)->skus->toArray();
        $attributes =  optional($model)->specificationItems->map(function ($item) {
            return [
                'id'        => optional($item->attribute)->id,
                'name'      => optional($item->attribute)->name,
                'values'    => optional($item->attribute)->values->each(function ($value) {
                    return  [
                        'id'    => optional($value)->id,
                        'value' => trim(optional($value)->value),
                    ];
                })->toArray(),
            ];
        })->toArray();

        $this->form->html(
            view(
                'admin::goods.skus',
                compact('skus', 'attributes')
            ),
        )->setWidth(10, 1)->setGroupClass('col-md-12');

//        $this->form->hasMany('skus', '', function (NestedForm $form) {
//            $form->select('attribute_value_id', __('goods_attribute_value'))->required();
//            $form->currency('price', __('price')) ->symbol('¥')->required()->setWidth(6, 3)->setGroupClass('col-md-4');
//            $form->currency('original_price', __('original_price')) ->symbol('¥')->required()->setWidth(6, 3)->setGroupClass('col-md-4');
//            $form->number('stock', __('stock'))->required()->setWidth(6, 3)->setGroupClass('col-md-4');
//            $form->textarea('description', '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.__('description'))->setWidth(10, 1);
//        })->setWidth(10, 1)->setGroupClass('col-md-12');
    }

    /**
     * 渲染不同模块的特殊字段
     */
    public function renderSpecialFields()
    {
    }

    /**
     * The data of the form.
     *
     * @return array $data
     */
    public function data()
    {
        return optional($this->getBase())->toArray();
    }

    /**
     * 获取 id
     *
     * @return int|null
     */
    private function getId()
    {
        return optional($this->getBase())->id;
    }

    /**
     * 获取基础信息模型对象
     *
     * @return array
     */
    protected function getBase()
    {
        return Arr::get(session('steps'), 'base');
    }

    /**
     * 保存方案:新增或者更新
     *
     * @param $request
     * @return mixed
     */
    public function save($request)
    {
        $id = $request->id;
        $model = $this->model->find($id);
        $attribute_ids = $request->attribute_ids;
        $attribute_names = $request->attribute_names;
        $attribute_values = $request->attribute_values;
        $attribute_value_names = $request->attribute_value_names;
        $stocks = $request->stock;
        $prices = $request->price;
        $original_prices = $request->original_price;
        $descriptions = $request->description;

        $store_array = [];
        $delete_array = [];
        $update_array = [];
        if ($attribute_values) {
            foreach ($attribute_values as $key => $values) {
                $stock = Arr::get($stocks, $key);// 库存
                $price = Arr::get($prices, $key);// 销售价格
                $original_price = Arr::get($original_prices, $key);// 原始价格
                $description = Arr::get($descriptions, $key);// 描述
                $value_names = Arr::get($attribute_value_names, $key);// 描述
//                dump($stock, $price, $description);

                $content = [];
                foreach ($values as $key_value => $value) {
                    $content[] = [
                        'attribute_id'          => $attribute_ids[$key_value],
                        'attribute_name'        => $attribute_names[$key_value],
                        'attribute_value_id'    => $value,
                        'attribute_value_name'  => $value_names[$key_value],
                    ];
                }
                // 新增
                if (Str::contains($key, 'new')) {
                    $store_array[] = [
                        'shop_id'       => $model->shop_id,
                        'category_id'   => $model->category_id,
                        'specification_id'  => $model->specification_id,
                        'stock'         => $stock,
                        'price'         => $price,
                        'original_price'=> $original_price,
                        'description'   => $description,
                        'content'       => my_json_encode($content),
                        'created_at'    => now()->toDateTimeString(),
                    ];
                } else {
                    $update_array[] = [
                        'id'            => $key,
                        'stock'         => $stock,
                        'price'         => $price,
                        'original_price'=> $original_price,
                        'description'   => $description,
                        'content'       => my_json_encode($content),
                        'updated_at'    => now()->toDateTimeString(),
                    ];
                }
            }
        }

        if ($store_array) {
            $model->skus()->createMany($store_array);
        }

        if ($update_array) {
            $updateColumn = array_keys(Arr::first($update_array));
            $referenceColumn = Arr::first($updateColumn);
            unset($updateColumn[0]);
            $whereIn = "";
            $q = 'UPDATE goods_skus SET ';
            foreach ($updateColumn as $uColumn) {
                $q .= $uColumn . " = CASE ";
                foreach ($update_array as $data) {
                    $q .= "WHEN " . $referenceColumn . " = " . $data[$referenceColumn] . " THEN '" . $data[$uColumn] . "' ";
                }
                $q .= "ELSE " . $uColumn . " END, ";
            }
            foreach ($update_array as $data) {
                $whereIn .= "'" . $data[$referenceColumn] . "', ";
            }
            $q = rtrim($q, ", ") . " WHERE " . $referenceColumn . " IN (" . rtrim($whereIn, ', ') . ")";
            DB::update(DB::raw($q));
        }

        // 设置价格,暂时设置最小的价格
        $price = optional($model->skus()->orderBy('price')->first())->price;
        $original_price = optional($model->skus()->orderBy('original_price')->first())->original_price;
        $model->price = $price;
        $model->original_price = $original_price;
        $model->save();

        return true;
    }
}