<?php
declare (strict_types=1);

namespace app\api\controller;

use app\api\model\RecoveryOrder;
use app\api\model\Server\RecoveryCategory;
use app\api\model\Server\ServerRecovery;
use app\common\enum\RecoveryStatusEnum;
use app\common\enum\RecoveryTypeEnum;
use app\common\library\helper;
use cores\exception\BaseException;
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
     * @throws DataNotFoundException
     * @throws DbException
     * @throws ModelNotFoundException
     * @author: wanghousheng
     */
    public function categoryList(): Json
    {
        $model = new RecoveryCategory();
        $list = $model->list();
        if (!empty($list)) {
            foreach ($list as $key => $value) {
                unset($list[$key]['image']);
            }
        }
        return $this->renderSuccess(compact('list'));
    }

    /**
     * @notes:服务列表页
     * @throws DbException
     * @author: wanghousheng
     */
    public function recoveryList(): Json
    {
        $recovery_name = $this->request->post('recovery_name');
        $category_id = intval($this->request->post('category_id'));
        $order_field = (string)$this->request->post('order_field');
        $order_sort = (string)$this->request->post('order_sort', 'desc');
        $where = [];
        if ($recovery_name) {
            $where[] = ['server_recovery.recovery_name', 'like', "%$recovery_name%"];
        }
        if ($category_id) {
            $where[] = ['server_recovery.category_id', '=', $category_id];
        }
        $where[] = ['server_recovery.status', '=', 1];
        $model = new ServerRecovery();
        $list = $model->getList($where, 15, $order_field, $order_sort);
        $data['list'] = $list->items();
        $data['total'] = $list->total();
        if (!$list->isEmpty()) {
            foreach ($data['list'] as $key => $value) {
                unset($data['list'][$key]['image']);
                unset($data['list'][$key]['category']);
            }
        }
        return $this->renderSuccess($data);
    }

    /**
     * @notes:用户回收订单列表
     * @return Json
     * @throws BaseException
     * @throws DbException
     * @author: wanghousheng
     */
    public function orderList(): Json
    {
        $where = [];
        $order_status = intval($this->request->post('order_status'));
        if ($order_status) {
            $where['order_status'] = $order_status;
        }
        $model = new RecoveryOrder();
        $list = $model->getUserList($where, 15, ['shop']);
        $data['list'] = $list->items();
        $data['total'] = $list->total();
        if ($data['total']) {
            $recovery_id = array_column($data['list'], 'recovery_id');
            $model = new ServerRecovery();
            $recovery_list = $model->whereIn('recovery_id', $recovery_id)
                ->with(['image'])
                ->select()
                ->toArray();
            $image_list = [];
            if ($recovery_list) {
                $image_list = array_column($recovery_list, 'recovery_image', 'recovery_id');
            }
            foreach ($data['list'] as $key => $value) {
                $data['list'][$key]['is_cancel'] = 0;
                $data['list'][$key]['is_success'] = 0;
                $data['list'][$key]['is_edit'] = 0;
                $data['list'][$key]['recovery_image'] = '';
                if (!empty($image_list[$value['recovery_id']])) {
                    $data['list'][$key]['recovery_image'] = $image_list[$value['recovery_id']];
                }
                if ($value['order_status'] == RecoveryStatusEnum::ACCEPTED) {
                    $data['list'][$key]['is_cancel'] = 1;
                    $data['list'][$key]['is_success'] = 1;
                    $data['list'][$key]['is_edit'] = 1;
                }
            }
        }
        return $this->renderSuccess($data);
    }

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

    public function updateOrderStatus(): Json
    {
        $params = $this->request->param();
        if (empty($params['order_id']) || empty($params['recovery_id']) || empty($params['status'])) {
            return $this->renderError('缺少必要参数');
        }
        $model = (new RecoveryOrder())::detail($params['order_id']);
        if ($model) {
            if ($params['status'] == RecoveryStatusEnum::ALREADY || $params['status'] == RecoveryStatusEnum::FINISN) {
                $res = $model->save(['order_status' => $params['status']]);
                if ($res) {
                    return $this->renderSuccess('更新成功');
                }
            }
        }
        return $this->renderError('更新失败');
    }

    /**
     * @notes:获取详情
     * @return Json
     * @throws BaseException
     * @author: wanghousheng
     */
    public function orderDetail(): Json
    {
        $orderId = intval($this->request->post('order_id'));
        if (!$orderId) {
            return $this->renderError('缺少必要参数');
        }
        $model = new RecoveryOrder();
        $info = $model->getDetails($orderId);
        if ($info && !empty($info['images'])) {
            $info['is_cancel'] = 0;
            $info['is_success'] = 0;
            $info['is_edit'] = 0;
            if ($info['order_status'] == RecoveryStatusEnum::ACCEPTED) {
                $info['is_cancel'] = 1;
                $info['is_success'] = 1;
                $info['is_edit'] = 1;
            }
            $images_list = helper::getArrayColumn($info['images'], 'file');
//            $arr = [];
//            foreach ($images_list as $image) {
//                $arr[] = $image['preview_url'];
//            }
//            $info['images_list'] = $arr;
            $info['images_list'] = $images_list;
            unset($info['images']);
            //回收信息
            $info['recovery_image'] = '';
            $recoveryInfo = ServerRecovery::detail(['recovery_id' => $info['recovery_id']], ['image']);
            if (!empty($recoveryInfo['recovery_image'])) {
                $info['recovery_image'] = $recoveryInfo['recovery_image'];
            }
            //门店信息
            $info['shop_info'] = \app\api\model\store\Shop::detail($info['shop_id'], ['logoImage']);
        }
        return $this->renderSuccess(['detail' => $info]);
    }

    /**
     * @notes:取消订单
     * @return Json
     * @throws BaseException
     * @author: wanghousheng
     */
    public function cancelOrder(): Json
    {
        $orderId = intval($this->request->post('order_id'));
        if (!$orderId) {
            return $this->renderError('缺少必要参数');
        }
        $model = new RecoveryOrder();
        if ($model->cancel($orderId)) {
            return $this->renderSuccess('操作成功');
        }
        return $this->renderError('操作失败');

    }

    /**
     * @notes:新增记录
     * @return Json
     * @throws BaseException
     * @author: wanghousheng
     */
    public function addOrder(): Json
    {
        $imageIds = $this->request->post('image_ids');
        if ($imageIds) {
            if (!is_array($imageIds)) {
                $imageIds = explode(',', $imageIds);
            }
        } else {
            $imageIds = [];
        }
        $shop_id = intval($this->request->post('shop_id'));
        if (!$shop_id) {
            return $this->renderError('门店不能为空');
        }
        $recovery_id = intval($this->request->post('recovery_id'));
        if (!$recovery_id) {
            return $this->renderError('缺少必要参数');
        }
        $model = new ServerRecovery();
        $recovery_name = $model->where(['recovery_id' => $recovery_id, 'status' => 1])->value('recovery_name');
        if (!$recovery_name) {
            return $this->renderError('非法请求');
        }
        $recovery_type_arr = array_values(RecoveryStatusEnum::data());
        $recovery_type_arr = array_column($recovery_type_arr, 'value');
        $recovery_type = intval($this->request->post('recovery_type'));
        if (!in_array($recovery_type, $recovery_type_arr)) {
            return $this->renderError('回收方式错误');
        }
        $username = $this->request->post('username');
        if (!$username) {
            return $this->renderError('姓名不能为空');
        }
        $server_time = $this->request->post('server_time');
        if (!$server_time || !strtotime($server_time)) {
            return $this->renderError('服务时间不合法');
        }
        $mobile = $this->request->post('mobile');
        if (!$mobile || !preg_match("/1[3457896]\d{9}$/", $mobile)) {
            return $this->renderError('手机号不正确');
        }
        $expect_price = $this->request->post('expect_price');
        if (!$expect_price || helper::number2($expect_price) <= 0) {
            return $this->renderError('期待价格不能为空');
        }
        $sex = intval($this->request->post('sex', 1));
        $remake = $this->request->post('remake');
        $brand = $this->request->post('brand');
        if (!$brand) {
            return $this->renderError('品牌不能为空');
        }
        $model = $this->request->post('model');
        if (!$model) {
            return $this->renderError('型号不能为空');
        }
        $wx_account = $this->request->post('wx_account');
        $house_number = $this->request->post('house_number');
        $shipping_address = $this->request->post('shipping_address');
        //邮寄回收
        if ($recovery_type == RecoveryTypeEnum::MAIL || $recovery_type == RecoveryTypeEnum::DOOR) {
            if (!$shipping_address) {
                return $this->renderError('联系地址不能为空');
            }
            if (!$house_number) {
                return $this->renderError('门牌号不能为空');
            }
        }
        $express_id = intval($this->request->post('express_id'));
        $express_no = $this->request->post('express_no');
        $data = [
            'recovery_id' => $recovery_id,
            'express_id' => $express_id,
            'express_no' => $express_no,
            'shipping_address' => $shipping_address,
            'wx_account' => $wx_account,
            'model' => $model,
            'brand' => $brand,
            'remake' => $remake,
            'sex' => $sex,
            'expect_price' => $expect_price,
            'mobile' => $mobile,
            'server_time' => $server_time,
            'username' => $username,
            'recovery_type' => $recovery_type,
            'shop_id' => $shop_id,
            'recovery_name' => $recovery_name,
            'house_number' => $house_number,
        ];
        $model = new RecoveryOrder();
        if ($model->add($data, $imageIds)) {
            return $this->renderSuccess('提交成功');
        }
        return $this->renderError('提交失败');
    }

    /**
     * @notes:更新
     * @return Json
     * @author: wanghousheng
     */
    public function updateOrder(): Json
    {
        $order_id = intval($this->request->post('order_id'));
        if (!$order_id) {
            return $this->renderError('缺少必要参数');
        }
        $image_str = $this->request->post('image_ids');
        $imageIds = [];
        if ($image_str) {
            $imageIds = explode(',', $image_str);
        }
        $shop_id = intval($this->request->post('shop_id'));
        if (!$shop_id) {
            return $this->renderError('门店不能为空');
        }
        $recovery_type_arr = array_values(RecoveryStatusEnum::data());
        $recovery_type_arr = array_column($recovery_type_arr, 'value');
        $recovery_type = intval($this->request->post('recovery_type'));
        if (!in_array($recovery_type, $recovery_type_arr)) {
            return $this->renderError('回收方式错误');
        }
        $username = $this->request->post('username');
        if (!$username) {
            return $this->renderError('姓名不能为空');
        }
        $server_time = $this->request->post('server_time');
        if (!$server_time || !strtotime($server_time)) {
            return $this->renderError('服务时间不合法');
        }
        $mobile = $this->request->post('mobile');
        if (!$mobile || !preg_match("/1[3457896]\d{9}$/", $mobile)) {
            return $this->renderError('手机号不正确');
        }
        $expect_price = $this->request->post('expect_price');
        if (!$expect_price || helper::number2($expect_price) <= 0) {
            return $this->renderError('期待价格不能为空');
        }
        $sex = intval($this->request->post('sex', 1));
        $remake = $this->request->post('remake');
        $brand = $this->request->post('brand');
        if (!$brand) {
            return $this->renderError('品牌不能为空');
        }
        $model = $this->request->post('model');
        if (!$model) {
            return $this->renderError('型号不能为空');
        }
        $wx_account = $this->request->post('wx_account');
        $house_number = $this->request->post('house_number');
        $shipping_address = $this->request->post('shipping_address');
        //邮寄回收
        if ($recovery_type == RecoveryTypeEnum::MAIL) {
            if (!$shipping_address) {
                return $this->renderError('发货地址不能为空');
            }
            if (!$house_number) {
                return $this->renderError('门牌号不能为空');
            }
        }
        $express_id = intval($this->request->post('express_id'));
        $express_no = $this->request->post('express_no');
        $data = [
            'express_id' => $express_id,
            'express_no' => $express_no,
            'shipping_address' => $shipping_address,
            'wx_account' => $wx_account,
            'model' => $model,
            'brand' => $brand,
            'remake' => $remake,
            'sex' => $sex,
            'expect_price' => $expect_price,
            'mobile' => $mobile,
            'server_time' => $server_time,
            'username' => $username,
            'recovery_type' => $recovery_type,
            'shop_id' => $shop_id,
            'house_number' => $house_number,
        ];
        $model = new RecoveryOrder();
        $model->edit($data, $order_id, $imageIds);
        return $this->renderSuccess('操作成功');
    }

    /**
     * @notes:订单验收
     * @return Json
     * @author: wanghousheng
     */
    public function completeOrder(): Json
    {
        $order_id = intval($this->request->post('order_id'));
        $real_price = $this->request->post('real_price');
        if (!$real_price || helper::number2($real_price) <= 0) {
            return $this->renderError('回收价不能为空');
        }
        if (!$order_id) {
            return $this->renderError('缺少必要参数');
        }
        if (!RecoveryOrder::detail(['order_id' => $order_id, 'order_status' => RecoveryStatusEnum::ACCEPTED])) {
            return $this->renderError('订单信息不存在');
        }
        $model = new RecoveryOrder();
        if ($model->where(['order_id' => $order_id])->save(['order_status' => RecoveryStatusEnum::ALREADY, 'real_price' => helper::number2($real_price)])) {
            return $this->renderSuccess('操作成功');
        }
        return $this->renderError('操作失败');
    }
}