<?php
// +----------------------------------------------------------------------
// | likeadmin快速开发前后端分离管理后台(PHP版)
// +----------------------------------------------------------------------
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
// | 开源版本可自由商用,可去除界面版权logo
// | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
// | github下载:https://github.com/likeshop-github/likeadmin
// | 访问官网:https://www.likeadmin.cn
// | likeadmin团队 版权所有 拥有最终解释权
// +----------------------------------------------------------------------
// | author: likeadminTeam
// +----------------------------------------------------------------------
namespace app\api\controller;

use app\api\logic\IndexLogic;
use app\common\model\Company;
use app\common\model\company\CompanyProperty;
use app\common\model\contract\VehicleContract;
use app\common\model\vehicle\VehicleRent;
use think\facade\Db;
use think\facade\Log;
use think\response\Json;


/**
 * index
 * Class IndexController
 * @package app\api\controller
 */
class IndexController extends BaseApiController
{
    public array $notNeedLogin = ['index', 'config', 'policy', 'decorate', 'notifyUrl', 'notifyProperty', 'notifyAuthentication', 'notifyVehicleContractUpdate', 'systemCarRent', 'selfCarRent', 'cancelRent'];

    /**
     * @notes 首页数据
     * @return Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     * @author 段誉
     * @date 2022/9/21 19:15
     */
    public function index()
    {
        $result = IndexLogic::getIndexData();
        return $this->data($result);
    }


    /**
     * @notes 全局配置
     * @return Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     * @author 段誉
     * @date 2022/9/21 19:41
     */
    public function config()
    {
        $parmas = $this->request->param();
        $group_id = $this->userInfo ? $this->userInfo['group_id'] : 1;
        $result = IndexLogic::getConfigData($group_id, $parmas);
        return $this->data($result);
    }


    /**
     * @notes 政策协议
     * @return Json
     * @author 段誉
     * @date 2022/9/20 20:00
     */
    public function policy()
    {
        $type = $this->request->get('type/s', '');
        $result = IndexLogic::getPolicyByType($type);
        return $this->data($result);
    }


    /**
     * @notes 装修信息
     * @return Json
     * @author 段誉
     * @date 2022/9/21 18:37
     */
    public function decorate()
    {
        $id = $this->request->get('id/d');
        $result = IndexLogic::getDecorate($id);
        return $this->data($result);
    }

    /**签约回调 */
    public function notifyUrl()
    {
        $a = Request()->get();
        if ($a) {
            $find = Db::name('contract')->where('id', $a['id'])->find();
            if ($find) {
                if ($find['signing_timer'] == 0) {
                    Db::name('contract')->where('id', $a['id'])->update(['signing_timer' => 1]);
                    return true;
                } else if ($find['signing_timer'] == 1) {
                    Db::name('contract')->where('id', $a['id'])->update(['status' => 1, 'signing_timer' => 2]);
                    if ($find['type'] == 1) {
                        Db::name('company')->where('id', $find['party_a'])->update(['status' => 1, 'is_contract' => 1]);
                        Db::name('company')->where('id', $find['party_b'])->update(['status' => 1, 'is_contract' => 1]);
                    } else {
                        Db::name('company')->where('id', $find['party_a'])->update(['status' => 1, 'is_contract' => 1]);
                        Db::name('user')->where('id', $find['party_b'])->update(['is_contract' => 1]);
                    }
                }
            }
        }
        return json(['success' => true, 'msg' => '成功']);
    }

    //镇街车辆租赁回调
    public function townCarRent() {
        $id = Request()->get('id');
        if(empty($id)){
            return json(['success' => false, 'msg' => '缺少参数']);
        }
        //获取合同数据
        $contract = VehicleContract::where('id', $id)->find();
        if (empty($contract)) {
            return json(['success' => false, 'msg' => '获取数据失败']);
        }
        if($contract['status'] != 2){
            return json(['success' => false, 'msg' => '合同状态错误']);
        }
        if ($contract['signing_timer'] == 0) {
            //更新本地合同状态
            $updateLocalRes = VehicleContract::where('id',$contract['id'])->update(['signing_timer'=>1]);
            //更新远程
            $updateSverRes =curl_post(env('project.logistic_domain').'/api/index/notifyContractUpdate',[],[
                'id' => $contract['contract_logistic_id'],
                'signing_timer' => 1,
            ]);
            if(!$updateLocalRes || $updateSverRes['code']==0){
                return json(['success' => false, 'msg' => '更新失败']);
            }
        }else if($contract['signing_timer'] == 1){
            //更新本地合同状态
            $updateLocalRes = VehicleContract::where('id',$contract['id'])->update(['signing_timer'=>2,'status' => 3]);
            //更新远程
            $updateSverRes =curl_post(env('project.logistic_domain').'/api/index/notifyContractUpdate',[],[
                'id' => $contract['contract_logistic_id'],
                'signing_timer' => 2,
                'status' => 3
            ]);
            if(!$updateLocalRes || $updateSverRes['code']==0){
                return json(['success' => false, 'msg' => '更新失败']);
            }
        }
    }

    //系统车辆租赁回来
    public function systemCarRent()
    {
        //获取参数
        $id = $this->request->get('id');
        if (empty($id)) {
            return json(['success' => false, 'msg' => '失败1.1']);
        }
        //获取合同数据
        $contract = VehicleContract::where('id', $id)->find();
        if (empty($contract)) {
            return json(['success' => false, 'msg' => '失败1.2']);
        }
        if ($contract['type'] != 0) {
            return json(['success' => false, 'msg' => '失败1.3']);
        }
        if ($contract['status'] != 2) {
            return json(['success' => false, 'msg' => '失败1.4']);
        }
        //判断签约方
        if ($contract['signing_timer'] == 0) {
            //更新合同的签约次数
            $res = VehicleContract::where('id', $id)->update(['signing_timer' => 1]);
            if (!$res) {
                return json(['success' => false, 'msg' => '失败1.5']);
            }
            return json(['success' => true, 'msg' => '成功']);
        } else if ($contract['signing_timer'] == 1) {
            //获取签约后的合同
            $signContractFile = app(JunziqianController::class)->downloadVehicleContractFile($contract['contract_no']);
            $signContractFile = $signContractFile ?? '';
            //更改合同状态
            VehicleContract::where('id', $id)->update(['signing_timer' => 2, 'status' => 3,'contract_url'=>$signContractFile]);
            //添加车辆到租赁列表
            $vehicle = json_decode($contract['cars_info'], true);
            VehicleRent::where('car_id', $vehicle['id'])->update([
                'status' => 2,
                'rent_time' => time(),
                'rent_company_id' => $contract['company_b_id'],
            ]);
            $party_b = Company::where('id', $contract['company_b_id'])->find();
            //通知物流系统跟新
            curl_post(env('project.logistic_domain').'/api/updateVehicleRent', [], [
                'car_id' => $vehicle['id'],
                'use_user_id' => $party_b['user_id'],
                'use_user_name' => $party_b['master_name'],
                'use_user_phone' => $party_b['master_phone']
            ]);
            CompanyProperty::create([
                'company_id' => $contract['company_b_id'],
                'object_id' => $vehicle['id'],
                'type' => 1,
                'create_time' => time(),
                'update_time' => time(),
            ]);
            return json(['success' => true, 'msg' => '成功']);
        } else {
            return json(['success' => true, 'msg' => '成功']);
        }
    }

    //自有车辆租赁回答
    public function selfCarRent()
    {
        //获取参数
        $id = $this->request->get('id');
        if (empty($id)) {
            return json(['success' => false, 'msg' => '失败2.1']);
        }
        //获取合同数据
        $contract = VehicleContract::where('id', $id)->find();
        if (empty($contract)) {
            return json(['success' => false, 'msg' => '失败2.2']);
        }
        if ($contract['type'] != 1) {
            return json(['success' => false, 'msg' => '失败2.3']);
        }
        if ($contract['status'] != 2) {
            return json(['success' => false, 'msg' => '失败2.4']);
        }
        //判断签约方
        if ($contract['signing_timer'] == 0) {
            $res = VehicleContract::where('id', $id)->update(['signing_timer' => 1]);
            if (!$res) {
                return json(['success' => false, 'msg' => '失败2.5']);
            }
            return json(['success' => true, 'msg' => '成功']);
        } else if ($contract['signing_timer'] == 1) {
            //添加车辆到物流系统
            $vehicle = json_decode($contract['cars_info'], true);
            $curl_res = curl_post(env('project.logistic_domain').'/api/addSelfCar', [], [
                'license' => $vehicle['license'],
                'pic' => $vehicle['pic'],
                'company_id' => $contract['company_a_id'],
                'company_name' => $contract['company_a_name'],
                'company_user' => $contract['company_a_user'],
                'company_phone' => $contract['company_a_phone'],
            ]);
            if (!$curl_res || $curl_res['code'] == 0) {
                return json(['success' => false, 'msg' => '失败2.6']);
            }
            $cars_info = json_encode(['id' => $curl_res['data']['car_id'], 'license' => $vehicle['license']]);
            //获取签约后的合同
            $signContractFile = app(JunziqianController::class)->downloadVehicleContractFile($contract['contract_no']);
            $signContractFile = $signContractFile ?? '';
            VehicleContract::where('id', $id)->update(['cars_info'=>$cars_info,'update_time'=>time(),'signing_timer'=>2,'status'=>3,'contract_url'=>$signContractFile]);
            VehicleRent::create([
                'car_id' => $curl_res['data']['car_id'],
                'contract_id' => $contract['id'],
                'company_id' => $contract['company_a_id'],
                'car_license' => $vehicle['license'],
                'status' => 2,
                'rent_time' => time(),
                'rent_company_id' => $contract['company_b_id'],
                'create_time' => time(),
                'type' => 1
            ]);
            $car_id = $curl_res['data']['car_id'];
            $party_b = Company::where('id', $contract['company_b_id'])->find();
            //通知物流系统跟新
            curl_post(env('project.logistic_domain').'/api/updateVehicleRent', [], [
                'car_id' => $car_id,
                'use_user_id' => $party_b['user_id'],
                'use_user_name' => $party_b['master_name'],
                'use_user_phone' => $party_b['master_phone']
            ]);
            CompanyProperty::create([
                'company_id' => $contract['company_b_id'],
                'object_id' => $car_id,
                'type' => 1,
                'create_time' => time(),
                'update_time' => time(),
            ]);
            return json(['success' => true, 'msg' => '成功']);
        } else {
            return json(['success' => true, 'msg' => '成功']);
        }
    }

    //解除合同回调
    public function cancelRent()
    {
        //获取参数
        $id = $this->request->get('id');
        if (empty($id)) {
            return json(['success' => false, 'msg' => '失败3.1']);
        }
        //获取合同数据
        $contract = VehicleContract::where('id', $id)->find();
        if (empty($contract)) {
            return json(['success' => false, 'msg' => '失败3.2']);
        }
        if ($contract['type'] != 2) {
            return json(['success' => false, 'msg' => '失败3.3']);
        }
        if ($contract['status'] != 2) {
            return json(['success' => false, 'msg' => '失败3.4']);
        }
        if ($contract['signing_timer'] == 0) {
            $res = VehicleContract::where('id', $id)->update(['signing_timer' => 1]);
            if (!$res) {
                return json(['success' => false, 'msg' => '失败3.5']);
            }
            return json(['success' => true, 'msg' => '成功']);
        } else if ($contract['signing_timer'] == 1) {
            //获取签约后的合同
            $signContractFile = app(JunziqianController::class)->downloadVehicleContractFile($contract['contract_no']);
            $signContractFile = $signContractFile ?? '';
            //更改合同状态
            VehicleContract::where('id', $id)->update(['signing_timer'=>2,'status'=>3,'contract_url'=>$signContractFile]);
            //更改租赁列表车辆状态
            $vehicle = json_decode($contract['cars_info'], true);
            //获取租赁车辆信息
            $vehicleRentInfo = VehicleRent::where('car_id', $vehicle['id'])->find();
            //更新原始合同类型
            VehicleContract::where('id', $vehicleRentInfo['contract_id'])->update(['type' => 2]);
            VehicleRent::where('car_id', $vehicle['id'])->update([
                'status' => 3,
            ]);
            //通知物流系统跟新
            curl_post(env('project.logistic_domain').'/api/cancelRent', [], [
                'car_id' => $vehicle['id'],
                'status' => 1
            ]);
            return json(['success' => true, 'msg' => '成功']);
        } else {
            return json(['success' => true, 'msg' => '成功']);
        }
    }

    //车辆租赁签约合同状态更改
    public function notifyVehicleContractUpdate()
    {
        if (!$this->request->isPost()) {
            return $this->fail('请求方式错误');
        }
        $param = $this->request->post();
        if (empty($param['contract_logistic_id'])) {
            return $this->fail('缺少必要参数');
        }
        $model = VehicleContract::where('contract_logistic_id', $param['contract_logistic_id'])->find();
        if (empty($model)) {
            return $this->fail('数据不存在');
        }
        $cars = json_decode($model['cars_info'], true);
        $result = $model->where('id', $model['id'])->save($param);
        if ($result && isset($param['status']) && $param['status'] == 3) {
            $data = [];
            foreach ($cars as $k => $v) {
                $data[$k]['car_id'] = $v['id'];
                $data[$k]['car_license'] = $v['license'];
                $data[$k]['type'] = 0;
                $data[$k]['status'] = 0;
                $data[$k]['company_id'] = $model['company_b_id'];
                $data[$k]['rent_time'] = 0;
                $data[$k]['rent_company_id'] = 0;
                $data[$k]['contract_id'] = $model['id'];
                $data[$k]['create_time'] = strtotime($model['create_time']);
            }
            $vehicleRent = new VehicleRent();
            $vehicleRent->saveAll($data);
        }
        //返回
        return $result ? $this->success('更新成功') : $this->fail('更新失败');
    }

    /**
     * 资产回调
     */
    public function notifyProperty()
    {
        $parmas = Request()->post();
        if ($parmas) {
            if (!isset($parmas['company_id']) || $parmas['company_id'] < 0) {
                return json(['success' => false, 'msg' => '公司id不能为空']);
            }
            if (!isset($parmas['object_id'])) {
                return json(['success' => false, 'msg' => '对象id不能为空']);
            }
            $data = [];
            $object_id = explode(',', $parmas['object_id']);
            foreach ($object_id as $k => $v) {
                if ($v > 0) {
                    $data[$k]['company_id'] = $parmas['company_id'];
                    $data[$k]['object_id'] = $v;
                    $data[$k]['type'] = 1;
                }
            }
            if (count($data) <= 0) {
                return json(['success' => false, 'msg' => '失败']);
            }
            $res = CompanyProperty::insertAll($data);
            if ($res) {
                return json(['success' => true, 'msg' => '成功']);
            } else {
                return json(['success' => false, 'msg' => '失败']);
            }
        }
        return json(['success' => false, 'msg' => '失败,没有参数']);
    }

    /**
     * 认证回调
     */
    public function notifyAuthentication()
    {
        $parmas = Request()->param();
        Log::info(['认证回调:',$parmas]);
        try {
            if ($parmas) {
                $data=json_decode($parmas['data'],true);
                if($data['status']==2){
                    Company::where('id', $parmas['id'])->update(['is_authentication' => 2]);
                }
                return  json(['success' => true, 'msg' => '成功']);
            }
        } catch (\Exception $e) {
            Log::error('认证回调错误:'.$e->getMessage());
        }

        return json(['success' => false, 'msg' => '失败,没有参数']);
    }
}