<?php
declare (strict_types=1);

namespace app\store\controller;

use app\common\enum\RecoveryStatusEnum;
use app\common\model\RecoveryOrder;
use app\store\model\server\RecoveryCategory;
use app\store\model\server\ServerRecovery;
use cores\Request;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\response\Json;

class Recovery extends Controller
{
    /**
     * @notes:分类列表
     * @return Json
     * @author: wanghousheng
     */
    public function categoryList(): Json
    {
        $name = $this->request->post('name');
        $where = [];
        if (!empty($name)) {
            $where[] = ['name', 'like', `%$name%`];
        }
        $model = new RecoveryCategory();
        try {
            $list = $model->getList($where);
        } catch (DataNotFoundException|ModelNotFoundException|DbException $e) {
            return $this->renderError($e->getMessage() ?: '接口异常');
        }
        return $this->renderSuccess(compact('list'));
    }

    /**
     * @notes:添加分类
     * @return Json
     * @author: wanghousheng
     */
    public function addCategory(): Json
    {
        $data = $this->postForm();
        if (!$data) {
            return $this->renderError('缺少必要参数');
        }
        $model = new RecoveryCategory();
        if ($model->add($data)) {
            return $this->renderSuccess('添加成功');
        }
        return $this->renderError($model->getError() ?: '添加失败');
    }

    /**
     * @notes:编辑分类
     * @param int $categoryId
     * @return Json
     * @author: wanghousheng
     */
    public function editCategory(int $categoryId): Json
    {
        $data = $this->postForm();
        if (!$data) {
            return $this->renderError('缺少必要参数');
        }
        $model = RecoveryCategory::detail($categoryId);
        if ($model->edit($data)) {
            return $this->renderSuccess('编辑成功');
        }
        return $this->renderError($model->getError() ?: '编辑失败');
    }

    public function deleteCategory(int $categoryId): Json
    {
        $model = RecoveryCategory::detail($categoryId);
        if ($model->remove()) {
            return $this->renderSuccess('删除成功');
        }
        return $this->renderError('删除失败');
    }

    /**
     * @notes:回收列表
     * @return Json
     * @author: wanghousheng
     */
    public function recoveryList(): Json
    {
        // 获取列表记录
        $model = new ServerRecovery();
        $recovery_name = $this->request->post('recovery_name');
        $category_id = intval($this->request->post('category_id'));
        $status = intval($this->request->post('status'));
        $where = [];
        if ($recovery_name) {
            $where[] = ['server_recovery.server_name', 'like', "%$recovery_name%"];
        }
        if ($category_id) {
            $where[] = ['server_recovery.category_id', '=', $category_id];
        }
        if ($status) {
            $where[] = ['server_recovery.status', '=', $status];
        }
        try {
            $list = $model->getList($where);
        } catch (DbException $e) {
            return $this->renderError($e->getMessage());
        }
        return $this->renderSuccess(compact('list'));
    }

    public function recoveryDetail(int $recoveryId): Json
    {
        // 获取商品详情
        $model = new ServerRecovery;
        $info = $model->getDetail($recoveryId);
        return $this->renderSuccess(compact('info'));
    }

    /**
     * @notes:添加回收
     * @return Json
     * @author: wanghousheng
     */
    public function addRecovery(): Json
    {
        $data = $this->postForm();
        if (!$data) {
            return $this->renderError('缺少必要参数');
        }
        $model = new ServerRecovery();
        if ($model->add($data)) {
            return $this->renderSuccess('添加成功');
        }
        return $this->renderError($model->getError() ?: '添加失败');
    }

    /**
     * @notes:编辑回收
     * @param int $recoveryId
     * @return Json
     * @author: wanghousheng
     */
    public function editRecovery(int $recoveryId): Json
    {
        $data = $this->postForm();
        if (!$data) {
            return $this->renderError('缺少必要参数');
        }
        $model = ServerRecovery::detail($recoveryId);
        if ($model->edit($data)) {
            return $this->renderSuccess('编辑成功');
        }
        return $this->renderError($model->getError() ?: '编辑失败');
    }

    /**
     * @notes:订单状态
     * @return Json
     * @author: wanghousheng
     */
    public function orderStatus(): Json
    {
        $list = array_values(RecoveryStatusEnum::data());
        return $this->renderSuccess(compact('list'));
    }

    /**
     * @notes:删除回收
     * @param array $recoveryId
     * @return Json
     * @author: wanghousheng
     */
    public function deleteRecovery(array $recoveryId): Json
    {
        $model = new ServerRecovery;
        if ($model->remove($recoveryId)) {
            return $this->renderSuccess('删除成功');
        }
        return $this->renderError('删除失败');
    }

    /**
     * 修改回收状态(上下架)
     * @param array $recoveryIds id集
     * @param bool $state 为true表示上架
     * @return Json
     */
    public function recoveryStatus(array $recoveryIds, bool $state): Json
    {
        $model = new ServerRecovery;
        if (!$model->setStatus($recoveryIds, $state)) {
            return $this->renderError($model->getError() ?: '操作失败');
        }
        return $this->renderSuccess('操作成功');
    }

    /**
     * 回收订单列表
     */
    public function orderList(Request $request): Json
    {
        $params = $request->param();
        $filter = [];
        if(!empty($params['order_no'])) {
            $filter[] = ['order_no', 'like', "%{$params['order_no']}%"];
        }
        if (!empty($params['order_status']) && $params['order_status'] != 'all') {
            $filter[] = ['order_status', '=', $params['order_status']];
        }

        $model = new RecoveryOrder();
        $list = $model->where($filter)
            ->alias('a')
            ->join('user b', 'b.user_id = a.user_id')
            ->field('a.*,b.mobile as user_mobile,b.nick_name as user_nick_name')
            ->order('create_time', 'desc')
            ->paginate(10);
        return $this->renderSuccess(compact('list'));
    }

}