<?php
namespace app\api\controller;

use app\adminapi\logic\master_worker\MasterWorkerLogic;
use app\adminapi\logic\works\ServiceWorkLogic;
use app\api\lists\recharge\ServiceOrderLists;
use app\api\logic\ActivityLogic;
use app\api\logic\ServiceOrderLogic;
use app\api\validate\ServiceOrderValidate;
use app\common\model\works\ServiceWorkAppointmentLog;
use think\facade\Log;

/**
 * 订单类
 */
class ServiceOrderController extends BaseApiController
{

    /**
     * 订单列表
     * @return \think\response\Json
     */
    public function lists()
    {
        return $this->dataLists(new ServiceOrderLists());
    }

    /**
     * 订单详情
     * @return \think\response\Json
     */
    public function detail()
    {
        $params = (new ServiceOrderValidate())->goCheck('detail',[
            'user_id' => $this->userId,
            'user_info' => $this->userInfo,
            'domain'=>$this->request->domain()
        ]);
        $result = ServiceOrderLogic::detail($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        return $this->data($result);
    }

    public function getDetailStatus()
    {
        $params = (new ServiceOrderValidate())->goCheck('detail',[
            'user_id' => $this->userId,
        ]);
        $result = ServiceOrderLogic::getDetailStatus($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        return $this->data($result);
    }

    /**
     * 订单支付详情
     * @return \think\response\Json
     */
    public function orderPayInfo()
    {
        $params = (new ServiceOrderValidate())->goCheck('detail',[
            'user_id' => $this->userId,
        ]);
        $result = ServiceOrderLogic::orderPayInfo($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        return $this->data($result);
    }

    public function getMasterWorker()
    {
        $params = (new ServiceOrderValidate())->goCheck('worker',[
            'user_id' => $this->userId,
        ]);
        $result = ServiceOrderLogic::getMasterWorker($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        return $this->data($result);
    }

    /**
     * 提交订单
     * @return \think\response\Json
     */
    public function submitOrder()
    {
        $params = (new ServiceOrderValidate())->post()->goCheck('add', [
            'user_id' => $this->userId,
            'terminal' => $this->userInfo['terminal'],
            'user_info' => $this->userInfo
        ]);
        Log::write(json_encode($params,JSON_UNESCAPED_UNICODE));
        $result = ServiceOrderLogic::submitOrder($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        ActivityLogic::createPropertyOrder($params,$result);
        return $this->data($result);
    }

    /**
     * 取消订单
     * @return \think\response\Json
     */
    public function cancelOrder()
    {
        $params = (new ServiceOrderValidate())->post()->goCheck('cancel', [
            'user_id' => $this->userId,
            'terminal' => $this->userInfo['terminal'],
            'user_info' => $this->userInfo
        ]);
        $result = ServiceOrderLogic::cancelOrder($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        return $this->success('取消成功', [], 1, 1);
    }

    /**
     * 确认报价订单
     * @return \think\response\Json
     */
    public function confirmOrder()
    {
        $params = (new ServiceOrderValidate())->post()->goCheck('price', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceOrderLogic::confirmOrder($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        return $this->success('已确认报价，工程师即将开始服务', [], 1, 1);
    }

    /**
     * 用户确认服务完成
     * @return \think\response\Json
     */
    public function confirmServiceFinish()
    {
        $params = (new ServiceOrderValidate())->post()->goCheck('finished', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceOrderLogic::confirmServiceFinish($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        // 订单完成通知【给用户】 - 全款 -通知
        ServiceOrderLogic::serviceFinishNotice($params);
        // 工程师完单的时候设置该规则关闭，以及短信通知工程师
        ServiceOrderLogic::orderQuantityRule($params);
        return $this->success('已确认服务完成', [], 1, 1);
    }

    /**
     * 提交尾款订单
     * @return \think\response\Json
     */
    public function submitFinalOrder()
    {
        $params = (new ServiceOrderValidate())->post()->goCheck('final', [
            'user_id' => $this->userId,
            'terminal' => $this->userInfo['terminal'],
            'user_info' => $this->userInfo
        ]);
        Log::write(json_encode($params,JSON_UNESCAPED_UNICODE));
        $result = ServiceOrderLogic::submitFinalOrder($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        return $this->data($result);
    }

    /**
     * 重置订单优惠券
     * @return \think\response\Json
     */
    public function cancelOrderCoupon()
    {
        $params = (new ServiceOrderValidate())->post()->goCheck('cancelOrderCoupon', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceOrderLogic::cancelOrderCoupon($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        return $this->success('保存成功', [], 1, 1);
    }


    /**
     * 查询是否在服务区内
     * @return \think\response\Json
     */
    public function isServiceWithin()
    {
        $params = (new ServiceOrderValidate())->get()->goCheck('LonLat', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceOrderLogic::isService($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError(),['is_service'=>0]);
        }
        return $this->success('服务区域内', ['is_service'=>1], 1, 1);
    }

    /**
     * 申请改价
     * @return \think\response\Json
     */
    public function approvalChangePrice()
    {
        $params = (new ServiceOrderValidate())->post()->goCheck('changePrice', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceOrderLogic::approvalChangePrice($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        return $this->success('已提交改价申请，等待工程师确认', [], 1, 1);
    }

    /**
     * 申请改约
     * @return \think\response\Json
     */
    public function approvalChangeAppointment()
    {
        $params = (new ServiceOrderValidate())->post()->goCheck('changeAppointment', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceOrderLogic::approvalChangeAppointment($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        $order = ServiceOrderLogic::orderPayInfo($params);
        $workDetail = ServiceWorkAppointmentLog::where(['work_id'=>$order['work_id']])->order('id desc')->findOrEmpty();
        $masterDetail = MasterWorkerLogic::detail(['id'=>$result['master_worker_id']]);
        // 修改预约时间通知【给用户的通知】
        $res = event('Notice',  [
            'scene_id' => 117,
            'params' => [
                'user_id' => $result['user_id'],
                'date' => $params['appointment_time'],
                'tel' => asteriskString($masterDetail['mobile']),
            ]
        ]);
        // 修改预约时间通知【给工程师的通知，仅限公众号】
        $res = event('Notice',  [
            'scene_id' => 118,
            'params' => [
                'user_id' => $result['master_worker_id'],
                'order_id' => $order['work_id'],
                'thing4' => $result['title'],
                'time5' => date('Y-m-d H:i:s',$workDetail['last_appointment_time']),
                'time6' => date('Y-m-d H:i:s',$workDetail['this_appointment_time']),
                'thing11' => (iconv_strlen($result['address'])>15)?(mb_substr($result['address'],0,15,'UTF-8').'...'):$result['address'],
                'phone_number8' => asteriskString($result['mobile']),
            ]
        ]);

        return $this->success('已提交改约', [], 1, 1);
    }

    /**
     * 提交退款申请
     * @return \think\response\Json
     */
    public function approvalRefund()
    {
        $params = (new ServiceOrderValidate())->post()->goCheck('changePrice', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceOrderLogic::approvalRefund($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        return $this->success('已提交申请，等待客服确认中', [], 1, 1);
    }



    public function firmOrderLists()
    {
        return $this->dataLists(new ServiceOrderLists());
    }

    public function firmOrderSave()
    {
        $params = (new ServiceOrderValidate())->post()->goCheck('firmOrderSave', [
            'user_id' => $this->userId,
            'terminal' => $this->userInfo['terminal'],
            'user_info' => $this->userInfo
        ]);
        Log::write(json_encode($params,JSON_UNESCAPED_UNICODE));
        if(count($params['order_goods']) == 0){
            return $this->fail('请选择商品');
        }else{
            $params['goods_id'] = $params['order_goods'][0]['id'];
        }
        $result = ServiceOrderLogic::firmSubmitOrder($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        return $this->data($result);
    }

    /**
     *  绑定工程师-设置为加单
     * @return \think\response\Json
    */
    public function bindWorkerAndWork()
    {
        $params = (new ServiceOrderValidate())->post()->goCheck('bindWorkerAndWork', [
            'user_id' => $this->userId,
            'user_info' => $this->userInfo
        ]);
        $result = ServiceOrderLogic::bindWorkerAndWork($params);
        if (false === $result) {
            return $this->fail(ServiceOrderLogic::getError());
        }
        return $this->success('绑定成功', [], 1, 1);
    }

}