<?php

namespace app\admin\logic;

use app\model\CommonModel;
use app\model\CompanyGoodModel;
use app\model\GroupModel;
use app\model\GoodModel;
use app\model\VideoModel;
use think\Exception;
use think\exception\ValidateException;
use think\facade\Db;
use think\response\Json;

class CompanyGoodLogic extends BaseLogic
{

    //列表
    public static function list(array $data = []): Json
    {
        $db = CompanyGoodModel::alias('a')
            ->leftJoin('good b', 'b.id=a.good_id AND b.is_del=' . CommonModel::$del_normal)
            ->leftJoin('group c', 'c.id=a.group_id AND c.is_del=' . CommonModel::$del_normal)
            ->leftJoin('company d', 'd.id=c.company_id AND d.is_del=' . CommonModel::$del_normal)
            ->leftJoin('card e', 'e.id=c.card_id AND e.is_del=' . CommonModel::$del_normal)
            ->leftJoin('unit f', 'f.id=b.unit_id AND f.is_del=' . CommonModel::$del_normal)
            ->where(['a.is_del' => CommonModel::$del_normal]);

        if ($data['group_id'] != '') $db->where('a.group_id', $data['group_id']);
        if ($data['good_name'] != '') $db->whereLike('b.good_name', '%' . $data['good_name'] . '%');
        if ($data['good_code'] != '') $db->whereLike('b.good_code', '%' . $data['good_code'] . '%');
        if ($data['status'] != '') $db->where('a.status', $data['status']);
        if ($data['type'] != '') $db->where('b.type', $data['type']);

        $count = $db->count('a.id');

        $list = $db->field('a.id,d.title company_title,e.title card_title,a.code,b.good_code,b.good_name,b.good_cover_img,b.moq,b.type,b.step,f.unit,b.price,a.status,a.creater,a.addtime')
            ->page($data['page'], $data['size'])
            ->order(['a.is_top' => 'desc', 'a.weight' => 'desc', 'a.id' => 'desc'])
            ->select()
            ->toArray();

        return json_show(CommonModel::$success, '获取公司商品列表成功', ['count' => $count, 'list' => $list]);
    }

    //添加
    public static function add(array $data = []): Json
    {

        Db::startTrans();

        try {

            $rs = GroupModel::field('id')
                ->where(['id' => $data['group_id'], 'is_del' => CommonModel::$del_normal])
                ->findOrEmpty()
                ->isEmpty();
            if ($rs) throw new Exception('该分组不存在');

            $data['good_id'] = GoodModel::where('is_del', CommonModel::$del_normal)
                ->whereIn('id', $data['good_id'])
                ->column('id');
            if (empty($data['good_id'])) throw new Exception('该商品不存在');

            $rs = CompanyGoodModel::field('a.id,a.good_id,b.good_name,b.good_code')
                ->alias('a')
                ->leftJoin('good b', 'b.id=a.good_id AND b.is_del=' . CommonModel::$del_normal)
                ->where(['a.is_del' => CommonModel::$del_normal, 'a.group_id' => $data['group_id']])
                ->whereIn('a.good_id', $data['good_id'])
                ->findOrEmpty()
                ->toArray();
            if (!empty($rs)) throw new Exception("【{$rs['good_code']}】【{$rs['good_name']}】该商品重复添加");

            $insert = [];
            $date = date('Y-m-d H:i:s');
            foreach ($data['good_id'] as $good_id) {
                $insert[] = [
                    'group_id' => $data['group_id'],
                    'code' => make_no('CG'),
                    'good_id' => $good_id,
                    'is_del' => CommonModel::$del_normal,
                    'status' => CommonModel::$status_normal,
                    'is_top' => CommonModel::$top_no,
                    'weight' => 0,
                    'creater' => self::$uname,
                    'createrid' => self::$uid,
                    'addtime' => $date,
                    'updater' => self::$uname,
                    'updaterid' => self::$uid,
                    'updatetime' => $date,
                ];
            }

            $res = Db::name('company_good')->insertAll($insert);

            Db::commit();

            if ($res) return json_show(CommonModel::$success, '添加公司商品成功');
            else throw new Exception();

        } catch (Exception $exception) {
            Db::rollback();
            return json_show(CommonModel::$error_param, '添加公司商品失败,' . $exception->getMessage());
        }
    }

    //获取详情
    public static function read(int $id = 0): Json
    {
        $res = CompanyGoodModel::field(true)
            ->where(['id' => $id, 'is_del' => CommonModel::$del_normal])
            ->findOrEmpty()
            ->toArray();

        return empty($res) ? json_show(CommonModel::$error_param, '该公司商品为空') : json_show(CommonModel::$success, '获取公司商品详情成功', $res);
    }

    //编辑
    public static function edit(array $data = []): Json
    {
        $rs = CompanyGoodModel::field('id')
            ->where(['is_del' => CommonModel::$del_normal, 'id' => $data['id']])
            ->findOrEmpty()
            ->isEmpty();
        if ($rs) return json_show(CommonModel::$error_param, '该公司商品不存在');

        $rs = GroupModel::field('id')
            ->where(['id' => $data['group_id'], 'is_del' => CommonModel::$del_normal])
            ->findOrEmpty()
            ->isEmpty();
        if ($rs) return json_show(CommonModel::$error_param, '该分组不存在');

        $rs = GoodModel::field('id')
            ->where(['id' => $data['good_id'], 'is_del' => CommonModel::$del_normal])
            ->findOrEmpty()
            ->isEmpty();
        if ($rs) return json_show(CommonModel::$error_param, '该商品不存在');

        $rs = CompanyGoodModel::field('id')
            ->where(['is_del' => CommonModel::$del_normal, 'group_id' => $data['group_id'], 'good_id' => $data['good_id']])
            ->where('id', '<>', $data['id'])
            ->findOrEmpty()
            ->isEmpty();
        if (!$rs) return json_show(CommonModel::$error_param, '该公司商品已存在');

        $res = CompanyGoodModel::where('id', $data['id'])->save((array_merge($data, [
            'updater' => self::$uname,
            'updaterid' => self::$uid,
            'updatetime' => date('Y-m-d H:i:s'),
        ])));

        return $res ? json_show(CommonModel::$success, '编辑公司商品成功') : json_show(CommonModel::$error_param, '编辑公司商品失败');

    }

    //删除
    public static function delete(array $ids = []): Json
    {
        $res = CompanyGoodModel::whereIn('id', $ids)
            ->where('is_del', CommonModel::$del_normal)
            ->update([
                'is_del' => CommonModel::$del_deleted,
                'updatetime' => date('Y-m-d H:i:s'),
                'updaterid' => self::$uid,
                'updater' => self::$uname
            ]);

        return $res ? json_show(CommonModel::$success, '删除成功') : json_show(CommonModel::$error_param, '删除失败,该公司商品不存在');
    }

    //置顶
    public static function top(array $data = []): Json
    {
        $res = CompanyGoodModel::where(['id' => $data['id'], 'is_del' => CommonModel::$del_normal])
            ->where('is_top', '<>', $data['is_top'])
            ->update([
                'is_top' => $data['is_top'],
                'updaterid' => self::$uid,
                'updater' => self::$uname,
                'updatetime' => date('Y-m-d H:i:s')
            ]);

        return $res ? json_show(CommonModel::$success, '操作成功') : json_show(CommonModel::$error_param, '操作失败,该公司商品不存在或重复操作');
    }

    //启禁用
    public static function status(array $data = []): Json
    {
        $res = CompanyGoodModel::where(['id' => $data['id'], 'is_del' => CommonModel::$del_normal])
            ->where('status', '<>', $data['status'])
            ->update([
                'status' => $data['status'],
                'updaterid' => self::$uid,
                'updater' => self::$uname,
                'updatetime' => date('Y-m-d H:i:s')
            ]);

        return $res ? json_show(CommonModel::$success, '操作成功') : json_show(CommonModel::$error_param, '操作失败,该公司商品不存在或重复操作');
    }

}