<?php
// +----------------------------------------------------------------------
// | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2023 https://www.yiovo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
// +----------------------------------------------------------------------
// | Author: 萤火科技 <admin@yiovo.com>
// +----------------------------------------------------------------------
declare (strict_types=1);

namespace app\admin\controller;

use think\response\Json;
use app\store\model\Category as CategoryModel;
use think\facade\Db;

/**
 * 商品分类
 * Class Category
 * @package app\store\controller\goods
 */
class Category extends Controller
{
    /**
     * 商品分类列表
     * @return Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function list(): Json
    {
        $model = new CategoryModel;
        $list = $model->getList(['store_id' =>0]);
        return $this->renderSuccess(compact('list'));
    }

    /**
     * 删除商品分类
     * @param int $categoryId
     * @return Json
     */
    public function delete(int $categoryId): Json
    {
        // 分类详情
        $model = CategoryModel::detail($categoryId);
        if (!$model->remove()) {
            return $this->renderError($model->getError() ?: '删除失败');
        }
        return $this->renderSuccess('删除成功');
    }

    /**
     * 添加商品分类
     * @return Json
     */
    public function add(): Json
    {
        // 新增记录
        $model = new CategoryModel;
        $params = $this->postForm();
        $params['store_id'] = 0;
        if ($model->add($params)) {
            return $this->renderSuccess('添加成功');
        }
        return $this->renderError($model->getError() ?: '添加失败');
    }

    /**
     * 编辑商品分类
     * @param int $categoryId
     * @return Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function edit(int $categoryId): Json
    {
        // 分类详情
        $model = CategoryModel::detail($categoryId, ['image']);
        // 更新记录
        if ($model->edit($this->postForm())) {
            return $this->renderSuccess('更新成功');
        }
        return $this->renderError($model->getError() ?: '更新失败');
    }
    public function copyCategory(int $new_store_id){
        $store_id = 0;
        $model = new CategoryModel;
        $list = $model->getList(['store_id' =>$store_id]);
        if (!$list) {
            return;
        }
        foreach ($list as $value) {
            $value = $value->toArray();
            
            $value['store_id'] = $new_store_id;
            $value['create_time'] = time();
            $value['update_time'] = time();
            $value['image_id'] = $value['image_id'] ? $this->copyImage($value['image_id'], $new_store_id) : 0;
            $value['rank_image_id'] = $value['rank_image_id'] ? $this->copyImage($value['rank_image_id'], $new_store_id) : 0;
            $value['original_category_id'] = $value['category_id'];
            $temp = $value;
            unset($temp['children']);
            unset($temp['image']);
            unset($temp['rankimage']);
            unset($temp['category_id']);

            $firstid = Db::table('yoshop_category')->insertGetId($temp);
            if (!isset($value['children']) || !$value['children']) {
                continue;
            }
            foreach ($value['children'] as $value1) {
                $value1 = $value1->toArray();
                $value1['parent_id'] = $firstid;
                $value1['store_id'] = $new_store_id;
                $value1['create_time'] = time();
                $value1['update_time'] = time();
                $value1['image_id'] = $value1['image_id'] ? $this->copyImage($value1['image_id'], $new_store_id) : 0;
                $value1['rank_image_id'] = $value1['rank_image_id'] ? $this->copyImage($value1['rank_image_id'], $new_store_id) : 0;
                $value1['original_category_id'] = $value1['category_id'];
                $temp1 = $value1;
                unset($temp1['children']);
                unset($temp1['image']);
                unset($temp1['rankimage']);
                unset($temp1['category_id']);

                $secondid = Db::table('yoshop_category')->insertGetId($temp1);
                if (!isset($value1['children']) || !$value1['children']) {
                    continue;
                }
                foreach ($value1['children'] as $value2) {
                    $value2 = $value2->toArray();
                    $value2['parent_id'] = $secondid;
                    $value2['store_id'] = $new_store_id;
                    $value2['create_time'] = time();
                    $value2['update_time'] = time();
                    $value2['image_id'] = $value2['image_id'] ? $this->copyImage($value2['image_id'], $new_store_id) : 0;
                    $value2['rank_image_id'] = $value2['rank_image_id'] ? $this->copyImage($value2['rank_image_id'], $new_store_id) : 0;
                    $value2['original_category_id'] = $value2['category_id'];
                    $temp2 = $value2;
                    unset($temp2['children']);
                    unset($temp2['image']);
                    unset($temp2['rankimage']);
                    unset($temp2['category_id']);

                    $thirdid = Db::table('yoshop_category')->insertGetId($temp2);
                    if (!isset($value2['children']) || !$value2['children']) {
                        continue;
                    }
                    foreach ($value2['children'] as $value3) {
                        $value3 = $value3->toArray();
                        $value3['parent_id'] = $thirdid;
                        $value3['store_id'] = $new_store_id;
                        $value3['create_time'] = time();
                        $value3['update_time'] = time();
                        $value3['image_id'] = $value3['image_id'] ? $this->copyImage($value3['image_id'], $new_store_id) : 0;
                        $value3['rank_image_id'] = $value3['rank_image_id'] ? $this->copyImage($value3['rank_image_id'], $new_store_id) : 0;
                        $value3['original_category_id'] = $value3['category_id'];
                        $temp3 = $value3;
                        unset($temp3['children']);
                        unset($temp3['image']);
                        unset($temp3['rankimage']);
                        unset($temp3['category_id']);

                        $fourthid = Db::table('yoshop_category')->insertGetId($temp3);
                        if (!isset($value3['children']) || !$value3['children']) {
                            continue;
                        }
                        foreach ($value3['children'] as $value4) {
                            $value4 = $value4->toArray();
                            $value4['parent_id'] = $fourthid;
                            $value4['store_id'] = $new_store_id;
                            $value4['create_time'] = time();
                            $value4['update_time'] = time();
                            $value4['image_id'] = $value4['image_id'] ? $this->copyImage($value4['image_id'], $new_store_id) : 0;
                            $value4['rank_image_id'] = $value4['rank_image_id'] ? $this->copyImage($value4['rank_image_id'], $new_store_id) : 0;
                            $value4['original_category_id'] = $value4['category_id'];
                            $temp4 = $value4;
                            unset($temp4['children']);
                            unset($temp4['image']);
                            unset($temp4['rankimage']);
                            unset($temp4['category_id']);

                            Db::table('yoshop_category')->insertGetId($temp4);
                        }
                    }
                }
            }
        }
        return $this->renderSuccess($list);
    }
    public function copyImage($image_id, $store_id){
        $upload_file = DB::table("yoshop_upload_file")->where('file_id', $image_id)->find();
        if (!$upload_file) {
            return 0;
        }
        $upload_file['store_id'] = $store_id;
        $upload_file['create_time'] = time();
        unset($upload_file['file_id']);
        $new_image_id =  DB::table("yoshop_upload_file")->insertGetId($upload_file);
        return $new_image_id;
    }
    
}