<?php

namespace app\api\controller;

use app\Request;
use com\junziqian\sdk\bean\req\sign\ApplySignReq;
use com\junziqian\sdk\bean\req\user\OrganizationCreateReq;
use com\junziqian\sdk\util\exception\ResultInfoException;
use com\junziqian\sdk\util\RequestUtils;
use com\junziqian\sdk\util\ShaUtils;
use CURLFile;
use think\facade\Db;

class JunziqianController extends BaseApiController
{
    public array $notNeedLogin = ['index', 'download_file'];

    /**请求地址*/
    private $serviceUrl = 'https://api.sandbox.junziqian.com';
    /**appkey*/
    private $appkey = '3121e0d911b7943d';
    /**secret*/
    private $appSecret = '1e66d8b73121e0d911b7943d82bba174';


    /**默认加密方式:不输入使用sha256,其它可选择项md5,sha1,sha3-256*/
    private $encryMethod;
    /**默认ts单位:1毫秒,2秒*/
    private $tsType;

    public function index()
    {
        $data = [
            'name' => '我的合同',
            'signatories' => [['fullName' => '小米', 'identityType' => 1, 'identityCard' => '5002401XXXXXXXXX', 'mobile' => 18982406440, 'noNeedVerify' => 1, 'signLevel' => 1]],
            'url' => "https://dev.lihaink.cn/storage/202307/acbba88e77392348d3a8a4a1fdf210f1.pdf"
        ];
    }
    /**
     * 填充签名数据
     * @param $req array
     */
    public function fillSign($req)
    {
        /**默认加密方式:不输入使用sha256,其它可选择项md5,sha1,sha3-256*/
        $ts = time();
        if ($this->tsType == 1) {
            $ts = $ts * 1000;
        }
        $sign = null;
        $nonce = md5($ts . "");
        $signSrc = "nonce" . $nonce . "ts" . $ts . "app_key" . $this->appkey . "app_secret" . $this->appSecret;
        if ($this->encryMethod == null || $this->encryMethod == "sha256") {
            $sign = ShaUtils::getSha256($signSrc);
        } else if ($this->encryMethod == "sha1") {
            $sign = ShaUtils::getSha1($signSrc);
        } else if ($this->encryMethod == "md5") {
            $sign = md5($signSrc);
        } else {
            throw new ResultInfoException($this->encryMethod . ",必须为md5,sha1,sha256之一", "PARAM_ERROR");
        }
        $req['ts'] = $ts;
        $req['app_key'] = $this->appkey;
        $req['sign'] = $sign;
        $req['nonce'] = $nonce; //这只是为了生成一个随机值
        if ($this->encryMethod != null) {
            $req['encry_method'] = $this->encryMethod; //为''也不能传
        }
        return $req;
    }

    //企业实名认证上传

    public function EnterpriseCertification($data)
    {
        $requestUtils = new RequestUtils($this->serviceUrl, $this->appkey, $this->appSecret);
        //CURLFile 可以传url或filePath,但必须保证文件存在且有效,否则php不会报错,只会导致http请求返回null(并没有调到服务端)。
        //初始化合同参数
        $request = new OrganizationCreateReq();
        $request->name = $data['name'];
        $request->identificationType = 1; //证件类型:0多证,1多证合一
        $request->organizationType = 0; //组织类型 0企业,1事业单位
        $request->organizationRegNo = $data['organization_code'];
        $request->organizationRegImg = $data['business_license']; //new CURLFile('D:/tmp/test.png',null,"test.png");
        $request->legalName = $data["master_name"]; //法人
        if (isset($data['master_email'])) {
            $request->emailOrMobile = $data['master_email']; //邮箱
        }
        $request->notifyUrl = 'https://worker-task.lihaink.cn/v1/notify_authentication?id=' . $data['id'];
            // $request->emailOrMobile = ; //邮箱
        //发起创建企业请求
        $response = $requestUtils->doPost("/v2/user/organizationCreate", $request);
        return $response;
        // return $this->success('', (array)$response);
    }

    //重新提交企业实名认证
    public function organizationReapply($data)
    {
        $requestUtils = new RequestUtils($this->serviceUrl, $this->appkey, $this->appSecret);
        //CURLFile 可以传url或filePath,但必须保证文件存在且有效,否则php不会报错,只会导致http请求返回null(并没有调到服务端)。
        //初始化合同参数
        $request = new OrganizationCreateReq();
        $request->name = $data['name'];
        $request->identificationType = 1; //证件类型:0多证,1多证合一
        $request->organizationType = 0; //组织类型 0企业,1事业单位
        $request->organizationRegNo = $data['organization_code'];
        $request->organizationRegImg = $data['business_license']; //new CURLFile('D:/tmp/test.png',null,"test.png");
        $request->legalName = $data["master_name"]; //法人
        $request->emailOrMobile = $data['master_email']; //邮箱
        //发起创建企业请求
        $response = $requestUtils->doPost("/v2/user/organizationReapply", $request);
        return $response;
        // return $this->success('', (array)$response);
    }

    //企业实名认证状态查询
    public function StatusQuery()
    {
        $param = Request()->param();
        $requestUtils = new RequestUtils($this->serviceUrl, $this->appkey, $this->appSecret);
        //初始化合同参数
        $request = array(
            "emailOrMobile" => $param['email'], //TODO *
        );
        //发起请求
        $response = $requestUtils->doPost("/v2/user/organizationAuditStatus", $request);
        return $this->success('', (array)$response);
    }

    //企业自定义公章
    public function Custom_seal()
    {
        $requestUtils = new RequestUtils($this->serviceUrl, $this->appkey, $this->appSecret);
        //初始化合同参数
        $request = array(
            "signName" => "500XXXXXXXXXXXX", //TODO *
            "email" => "500XXXXXXXXXXXX", //TODO 不传则保存在商户下,传入注册的邮箱则上传到指定邮箱企业名下
            "signImgFile" => new CURLFile('D:/tmp/test.png', null, "test.png"),
        );
        $response = $requestUtils->doPost("/v2/user/uploadEntSign", $request);
        return $this->success('', (array)$response);
    }
    //签约
    public function Signing($data, $id)
    {
        $requestUtils = new RequestUtils($this->serviceUrl, $this->appkey, $this->appSecret);
        //CURLFile 可以传url或filePath,但必须保证文件存在且有效,否则php不会报错,只会导致http请求返回null(并没有调到服务端)。
        //初始化合同参数
        //[ ['fullName' => '小米', 'identityType' => 1, 'identityCard' => '5002401XXXXXXXXX', 'mobile' => 18982406440,'noNeedVerify'=>1,'signLevel'=>1] ]
        $request = new ApplySignReq();
        $request->contractName = $data['name'];
        $request->signatories = $data['signatories']; //签约方
        $request->serverCa = 1; //是否需要服务端云证书
        $request->fileType = 1; //合同上传方式 url
        $request->url = $data['url'];
        $request->notifyUrl = 'https://worker-task.lihaink.cn/notify_url?id=' . $id;
        $request->needQifengSign = 1;
        //发起PING请求
        // halt($request);
        $response = $requestUtils->doPost("/v2/sign/applySign", $request);
        return $response;
        // return $this->success('', (array)$response);
    }

    public function SigningLink($data)
    {
        //构建请求工具
        $requestUtils = new RequestUtils($this->serviceUrl, $this->appkey, $this->appSecret);
        //初始化合同参数
        $response = $requestUtils->doPost("/v2/sign/link", $data);
        return $response;

        // return $this->success('', (array)$response);
    }

    public function sms($data)
    {
        $requestUtils = new RequestUtils($this->serviceUrl, $this->appkey, $this->appSecret);
        //初始化请求参数
        $request = array(
            "applyNo" => $data['applyNo'], //TODO +
            //"businessNo" => "0000XXXXXXXXX", //TODO +
            "fullName" => $data['fullName'], //TODO *
            "identityCard" => $data['identityCard'], //TODO *
            "identityType" => 12, //TODO *
            "signNotifyType" => 1 //默认为1
        );
        $response = $requestUtils->doPost("/v2/sign/notify", $request);
        return $response;
    }

    //html模板
    public function html_contract($data, $id)
    {
        $requestUtils = new RequestUtils($this->serviceUrl, $this->appkey, $this->appSecret);
        //CURLFile 可以传url或filePath,但必须保证文件存在且有效,否则php不会报错,只会导致http请求返回null(并没有调到服务端)。
        //初始化合同参数
        $request = new ApplySignReq();
        $request->contractName = $data['name'];
        $request->signatories = $data['signatories']; //签约方
        $request->serverCa = 1; //是否需要服务端云证书
        $request->fileType = 3;
        $request->htmlContent = $data['content'];
        $request->notifyUrl = 'https://worker-task.lihaink.cn/notify_url?id=' . $id;
        $request->needQifengSign = 1;

        //发起PING请求
        $response = $requestUtils->doPost("/v2/sign/applySign", $request);
        return $response;
    }

    public function download_file($applyNo)
    {
        $requestUtils = new RequestUtils($this->serviceUrl, $this->appkey, $this->appSecret);
        $find = Db::name('contract')->where('contract_no', $applyNo)->value('contract_url');
        if ($find) {
            return $this->success('获取成功', ['url' => 'https://worker-task.lihaink.cn' . $find]);
        }
        //初始化请求参数
        $request = array(
            "applyNo" => $applyNo, //TODO +
        );
        $response = $requestUtils->doPost("/v2/sign/linkFile", $request);
        if ($response->success == true) {
            $this->getDownload($response->data, root_path() . 'public/uploads/contract/' . $applyNo . '.pdf');
            Db::name('contract')->where('contract_no', $applyNo)->update(['contract_url' => '/uploads/contract/' . $applyNo . '.pdf']);
            return $this->success('获取成功', ['url' => 'https://worker-task.lihaink.cn/uploads/contract/' . $applyNo . '.pdf']);
        } else {
            return $this->fail('获取失败');
        }
    }

    public function getDownload($url, $publicDir = '', $fileName = '', $type = 0)
    {

        //获取文件路径
        $newOneDir = substr($publicDir, 0, strrpos($publicDir, "/"));
        if (trim($url) == '') {
            return false;
        }
        //检验访问url是否有效
        $array = get_headers($url, 1);
        if (!preg_match('/200/', $array[0])) {
            return false;
        }
        if (trim($publicDir) == '') {
            return false;
        }
        //创建保存目录
        if (!file_exists($newOneDir) && !mkdir($newOneDir, 0777, true)) {
            return false;
        }
        //获取远程文件所采用的方法
        if ($type) {
            $ch = curl_init();
            $timeout = 5;
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
            $content = curl_exec($ch);
            curl_close($ch);
        } else {
            ob_start();
            readfile($url);
            $content = ob_get_contents();
            ob_end_clean();
        }
        $size = strlen($content);
        //文件大小
        $fp2 = @fopen($publicDir, 'a');
        fwrite($fp2, $content);
        fclose($fp2);
        unset($content, $url);
    }
}