<?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\common\logic;

use app\api\controller\JunziqianController;
use app\api\logic\SmsLogic;
use app\common\enum\user\AccountLogEnum;
use app\common\enum\user\UserTerminalEnum;
use app\common\logic\AccountLogLogic;
use app\common\logic\BaseLogic;
use app\common\model\contract\Contract;
use app\common\model\dict\DictData;
use app\common\model\user\User;
use think\facade\Db;

/**
 * 用户逻辑层
 * Class UserLogic
 * @package app\adminapi\logic\user
 */
class UserLogic extends BaseLogic
{

    /**
     * @notes 用户详情
     * @param int $userId
     * @return array
     * @author 段誉
     * @date 2022/9/22 16:32
     */
    public static function detail(int $userId): array
    {
        // $field = [
        //     'id', 'sn', 'account', 'nickname', 'avatar', 'real_name',
        //     'sex', 'mobile', 'create_time', 'login_time', 'channel',
        //     'user_money',
        // ];

        $user = User::where(['id' => $userId])
            ->findOrEmpty();

        $user['channel'] = UserTerminalEnum::getTermInalDesc($user['channel']);
        // $user->sex = $user->getData('sex');
        $user['qualification'] = json_decode($user->qualification, true);
        // if ($user->is_contract == 1) {
        $user['contract'] = Contract::where(['type' => 2, 'party_b' => $userId])->with(['partyA', 'contractType'])->find();
        // }
        return $user->toArray();
    }


    /**
     * @notes 更新用户信息
     * @param array $params
     * @return User
     * @author 段誉
     * @date 2022/9/22 16:38
     */
    public static function setUserInfo(array $params)
    {
        return User::update([
            'id' => $params['id'],
            $params['field'] => $params['value']
        ]);
    }


    /**
     * @notes 调整用户余额
     * @param array $params
     * @return bool|string
     * @author 段誉
     * @date 2023/2/23 14:25
     */
    public static function adjustUserMoney(array $params)
    {
        Db::startTrans();
        try {
            $user = User::find($params['user_id']);
            if (AccountLogEnum::INC == $params['action']) {
                //调整可用余额
                $user->user_money += $params['num'];
                $user->save();
                //记录日志
                AccountLogLogic::add(
                    $user->id,
                    AccountLogEnum::UM_INC_ADMIN,
                    AccountLogEnum::INC,
                    $params['num'],
                    '',
                    $params['remark'] ?? ''
                );
            } else {
                $user->user_money -= $params['num'];
                $user->save();
                //记录日志
                AccountLogLogic::add(
                    $user->id,
                    AccountLogEnum::UM_DEC_ADMIN,
                    AccountLogEnum::DEC,
                    $params['num'],
                    '',
                    $params['remark'] ?? ''
                );
            }

            Db::commit();
            return true;
        } catch (\Exception $e) {
            Db::rollback();
            return $e->getMessage();
        }
    }
    //**发起合同 */
    public static function initiate_contract($params, $adminId)
    {
        $params['party_a'] = Db::name('company')->where('admin_id', $adminId)->value('id');
        if ($params['party_a'] <= 0) {
            return self::setError('甲方不存在,请联系平台绑定公司');
        }
        $params['check_status'] = 1;
        $res = Contract::Initiate_contract($params);
        if (true === $res) {
            return true;
        }
        return self::setError('发起失败');
    }

    // /**生成合同 */
    public static function Draftingcontracts($params)
    {

        $result = self::detail($params['id']);
        if ($result && $result['contract'] && $result['contract']['file'] != '') {
            if ($result['contract']['check_status'] == 3) {
                return self::setError('你已经生成过合同,请问重复生成');
            }
            $data = [
                'name' => $result['nickname'] . '的合同',
                'signatories' => [['fullName' => $result['nickname'], 'identityType' => 1, 'identityCard' => $result['id_card'], 'mobile' => $result['mobile'],  'noNeedVerify' => 1, 'signLevel' => 1]],
                'url' => $result['contract']['file']
            ];
            $res = app(JunziqianController::class)->Signing($data, $result['contract']['id']);
            if ($res->success == true) {
                Db::name('contract')->where('id', $result['contract']['id'])->update(['contract_no' => $res->data, 'check_status' => 3]);
                $data = array(
                    "applyNo" => $res->data, //TODO *
                    "fullName" => $result['nickname'], //TODO *
                    "identityCard" => $result['id_card'], //TODO *
                    "identityType" => 1, //TODO *
                );
                $res = app(JunziqianController::class)->SigningLink($data);
                if ($res->success == true) {
                    Db::name('contract')->where('id', $result['contract']['id'])->update(['url' => $res->data]);
                    //发送短信
                    $sms = [
                        'mobile' => $result['mobile'],
                        'name' => $result['nickname'],
                        'type' => '《' . $result['contract']['contract_type_name'] . '》',
                        'code' => 'api/Hetong/url?id=' . $result['contract']['id'],
                        'scene' => 'WQ'
                    ];
                    $result = SmsLogic::contractUrl($sms);
                    if (true === $result) {
                        return true;
                    } else {
                        return self::setError(SmsLogic::getError());
                    }
                } else {
                    return self::setError($res->msg);
                }
            } else {
                return self::setError($res->msg);
            }
        } else {
            return self::setError('生成合同成功失败,联系管理员');
        }
    }

    //**发送短信 */
    public static function postsms($params)
    {
        $find = Db::name('contract')->where('party_b', $params['id'])
            ->withAttr('contract_type_name', function ($value, $data) {
                return Db::name('dict_data')->where('id', $data['contract_type'])->value('name');
            })
            ->find();
        if ($find) {
            //发送短信
            $sms = [
                'mobile' => $params['mobile'],
                'name' => $params['nickname'],
                'type' => '《' . $find['contract_type_name'] . '》',
                'code' => 'api/Hetong/url?id=' . $find['id'],
                'scene' => 'WQ'
            ];
            $result = SmsLogic::contractUrl($sms);
            if (true === $result) {
                return true;
            } else {
                return self::setError(SmsLogic::getError());
            }
        }
    }
}