<?php

namespace App\Controller;

use App\Amqp\Producer\AssignDoctorProducer;
use App\Amqp\Producer\CancelUnpayOrdersDelayDirectProducer;
use App\Constants\HttpEnumCode;
use App\Exception\BusinessException;
use App\Model\DoctorInquiryTime;
use App\Model\DoctorPharmacistCert;
use App\Model\OrderInquiry;
use App\Model\UserDoctor;
use App\Services\ImService;
use App\Services\MessagePush;
use App\Services\OrderPrescriptionService;
use App\Services\UserDoctorService;
use App\Utils\Log;
use Extend\Alibaba\Oss;
use Extend\Ca\Ca;
use Hyperf\Amqp\Producer;
use Hyperf\DbConnection\Db;
use Hyperf\Utils\ApplicationContext;
use Intervention\Image\ImageManager;
use TCPDF;

class TestController extends AbstractController
{
    public function test(){
//        $this->test_8();
//        $this->test_3();
//        $this->test_4();
//        $this->test_6();
//        $this->test_9();
//        $this->test_10();
        $this->test_11();
//        $this->test_5();
    }

    // 获取云证书-首次
    public function test_1(){
        $ca = new Ca();

        $data = array();
        $data['user_id'] = "491925054435950592";
        $data['card_num'] = "410323199603261241";
        $result = $ca->getCloudCert($data);

        $data = array();
        $data['user_id'] = "491925054435950592";
        $data['cert_base64'] = $result['certBase64'];
        $data['cert_chain_p7'] = $result['certP7'];
        $data['cert_serial_number'] = $result['certSerialnumber'];
        $data['ca_pin'] = "491925054435950592";
        $doctor_pharmacist_cert = DoctorPharmacistCert::addDoctorPharmacistCert($data);
        if (empty($doctor_pharmacist_cert)){
            return fail();
        }
    }

    // 获取用户云证书数据-验证PKCS7签名
    public function test_2(){
        $ca = new Ca();

        $params = array();
        $params['user_id'] = "491925054435950592";
        $doctor_pharmacist_cert = DoctorPharmacistCert::getOne($params);
        if (empty($doctor_pharmacist_cert)){
            return fail(HttpEnumCode::HTTP_ERROR,"用户数据错误");
        }

        // 获取云证书签名
        $data = array();
        $data['created_at'] = "2023-03-01 12:44:10";
        $data['department_custom_name'] = "外科";
        $data['user_name'] = "测试用户1";
        $data['sex'] = "男";
        $data['age'] = 19;
        $data['allergy_history'] = "无";
        $data['icd_name'] = "感冒";
        $data['doctor_advice'] = "多吃药";
        $data['product'] = [
            [
                "product_name" => "感冒药1（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
            [
                "product_name" => "感冒药2（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
            [
                "product_name" => "感冒药3（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
            [
                "product_name" => "感冒药4（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
            [
                "product_name" => "感冒药5（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
        ];

        $result = $ca->getCertSign("491925054435950592","491925054435950592",$data);

        // 验证PKCS7签名-验证无需处理，只要不返回错误即可
        $ca->verifyPkcs7($result['signP7'],$data);
    }

    // 添加签章配置（首次）
    public function test_3(){
        $ca = new Ca();

        // 下载阿里云图片
        $oss = new Oss();

        $filename = "applet/doctor/cert/f2abdb81-fac0-4264-bc11-aa2b6cf2761c.png";

        $style = "image/resize,m_lfit,w_100,h_350";

        $sign_image = $oss->getCusTomObjectToRAM($filename,$style);
        $sign_image = base64_encode($sign_image);
        if (!$sign_image){
            return fail(HttpEnumCode::SERVER_ERROR);
        }

        $sign_param = [
            [
                "llx"=> "500", // 左边底部X坐标
                "lly"=>"3015", // 左边底部Y坐标
                "urx"=>"850", // 右边上部x坐标
                "ury"=>"3115", // 右边上部y坐标
                "pageList"=>[1],
                "sealImg"=>$sign_image
            ]
        ];
        $data = array();
        $data['sign_param'] = json_encode($sign_param);
        $data['seal_img'] = $sign_image;

        $result = $ca->addUserSignConfig("491925054435950592","410323199603261241",$data);
    }

    // 获取用户签章图片
    public function test_4(){
        $ca = new Ca();
        $result = $ca->getFetchUserSeal("491925054435950592");
        $data = urldecode($result[0]['sealImg']);
        dump($data);
    }

    // 生成处方pdf图片
    public function test_5(){
        // 下载阿里云图片
        $oss = new Oss();

        $filename = "basic/file/prescription.jpg";
        $sign_image = $oss->getObjectToRAM($filename);

        $manager = new ImageManager();

        $image = $manager->make($sign_image);

        $fontPath = './extend/Ca/ZiYuYongSongTi-2.ttf';

        // 处方号
        $image->text('1234567890', 1480, 540, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 日期
        $image->text('2023-03-21', 354, 675, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 科室
        $image->text('测试科室1', 1385, 675, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 姓名
        $image->text('测试姓名', 354, 795, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 性别
        $image->text('男', 1385, 790, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 年龄
        $image->text('19', 354, 900, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 过敏史
        $image->text('对阿莫西林过敏对阿莫西林过敏', 405, 1030, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 初步诊断
        $image->text('对阿莫西林过敏对阿莫西林过敏', 445, 1145, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 医生建议
        $image->text('没有建议', 445, 1252, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        $data = array();
        $data['product'] = [
            [
                "product_name" => "感冒药1（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
            [
                "product_name" => "感冒药2（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
            [
                "product_name" => "感冒药3（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
            [
                "product_name" => "感冒药4（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
            [
                "product_name" => "感冒药5（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
        ];

        // 用药
        foreach ($data['product'] as $key => $item){
            if ($key <= 2){
                $x_axis = 229;
                $y_axis = 1600 + $key * 350;
            }else{
                $x_axis = 1240;
                $y_axis = 1600 + ($key - 3) * 350;
            }


            $image->text($item['product_name'], $x_axis, $y_axis, function ($font) use($fontPath) {
                $font->file($fontPath);
                $font->size(50);
                $font->align('left');
            });

            $image->text("用量：" . $item['single_unit'] . " " . $item['frequency_use'], $x_axis, $y_axis+90, function ($font) use($fontPath) {
                $font->file($fontPath);
                $font->size(50);
                $font->align('left');
            });

            $image->text("用法：" . $item['single_use'], $x_axis, $y_axis+180, function ($font) use($fontPath) {
                $font->file($fontPath);
                $font->size(50);
                $font->align('left');
            });
        }

        // 将处理后的图片重新保存到其他路径
//        $image->save('./runtime/2.jpg');

        $result = (string) $image->encode('png', 75);

        // 图片生成pdf
        $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);

        $pdf->AddPage();
        $pdf->Image('@' . $result, 10, 10, 0, 0, '', '', '', false, 300, '', false, false, 0, false, false, false);
        $pdf->Output(dirname(__DIR__, 2) . "/prescription_img.pdf","F");
    }

    // pdf进行签章
    public function test_6(){
        $pdf_file = fopen("./runtime/prescription_img.pdf",'r');

        $oss = new Oss();

        $filename = "applet/doctor/cert/f2abdb81-fac0-4264-bc11-aa2b6cf2761c.png";

        $style = "image/resize,m_lfit,w_100,h_350";

        $sign_image = $oss->getCusTomObjectToRAM($filename,$style);
        $sign_image = base64_encode($sign_image);
        if (!$sign_image){
            return fail(HttpEnumCode::SERVER_ERROR);
        }

        $sign_param = [
            [ // 医生端
                "llx"=>"120", // 左边底部X坐标
                "lly"=>"190", // 左边底部Y坐标
                "urx"=>"190", // 右边上部x坐标
                "ury"=>"140", // 右边上部y坐标
                "pageList"=>[1],
                "sealImg"=>$sign_image
            ],
//            [ // 药师端
//                "llx"=>"350", // 左边底部X坐标
//                "lly"=>"190", // 左边底部Y坐标
//                "urx"=>"440", // 右边上部x坐标
//                "ury"=>"140", // 右边上部y坐标
//                "pageList"=>[1],
//                "sealImg"=>$sign_image
//            ]
        ];
        $data = array();
        $data['sign_param'] = json_encode($sign_param);
        $data['pdf_file'] = $pdf_file;

        $ca = new Ca();
        $result = $ca->addSignPdf("491925054435950592",$data);

        $file_id = $result[0]['fileId'];

        $result = $ca->getSignedFile("491925054435950592",$file_id);
        if (empty($result)){
            return fail();
        }

//        $file = fopen("./runtime/test.pdf", "w") or die("Unable to open file!");
//        fwrite($file, $result);
//        fclose($file);

        // 上传阿里云oss

        $oss = new Oss();

        $filename = "applet/doctor/prescription/test.pdf";

        $result = $oss->putObject($filename, $result);
        dump($result);
    }

    // 延迟队列测试
    public function test_7(){
        $out_trade_no = $this->request->input('out_trade_no');
        if ($out_trade_no == 1){
            // 增加至取消订单延迟队列
            $data = array();
            $data['order_no'] = 111;
            $data['order_type'] = 1;

            $message = new CancelUnpayOrdersDelayDirectProducer($data);
            $message->setDelayMs(1000 * 5 * 1);
            $producer = $this->container->get(Producer::class);
            $res = $producer->produce($message);
            if (!$res) {
                Db::rollBack();
                return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
            }
        }else{
            // 增加至取消订单延迟队列
            $data = array();
            $data['order_no'] = 2222;
            $data['order_type'] = 1;

            $message = new CancelUnpayOrdersDelayDirectProducer($data);
            $message->setDelayMs(1000 * 15 * 1);
            $producer = $this->container->get(Producer::class);
            $res = $producer->produce($message);
            if (!$res) {
                Db::rollBack();
                return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
            }
        }
    }

    // 删除签章配置
    public function test_8(){
        $ca = new Ca();
        $result = $ca->deleteUserSignConfig("491925054435950592");
    }

    // 下载签章的pdf文件
    public function test_9(){
        $ca = new Ca();
        $result = $ca->getSignedFile("491925054435950592","1638734851418783746");
        if (empty($result)){
            return fail();
        }

        // 上传阿里云oss

        $oss = new Oss();

        $filename = "applet/doctor/prescription/491925054435950592.pdf";

        $result = $oss->putObject($filename, $result);
        dump($result);
    }

    public function test_10(){
//        $MessagePush = new MessagePush(2,"491923510680424449","499172549291458560");
//        $result = $MessagePush->noInquiry();

//        $MessagePush = new MessagePush(3,"491925054435950592","499176434366210048");
//        $result = $MessagePush->doctorAcceptedInquiry();

//        $ImService = new ImService();
//
//        $params = array();
//        $params['order_inquiry_id'] = "499313028868112385";
//        $order_inquiry = OrderInquiry::getOne($params);
//        if (!empty($order_inquiry)) {
//            $this->order_inquiry = $order_inquiry->toArray();
//        }
//
//        // 获取订单医生数据
//        $params = array();
//        $params['doctor_id'] = $order_inquiry['doctor_id'];
//        $user_doctor = UserDoctor::getOne($params);
//
//        // 自定义消息
//        $cloud_custom_data = array();
//        $cloud_custom_data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
//        $cloud_custom_data['is_system'] = 1;
//        $cloud_custom_data['inquiry_type'] = $order_inquiry['inquiry_type'];
//        $cloud_custom_data['message_rounds'] = 0;
//        $cloud_custom_data['patient_family_data']['patient_name'] = $order_inquiry['patient_name'];
//        $cloud_custom_data['patient_family_data']['patient_sex'] = $order_inquiry['patient_sex'];
//        $cloud_custom_data['patient_family_data']['patient_age'] = $order_inquiry['patient_age'];
//
//        // 消息内容
//        $message_content_data = array();
//        $message_content_data['message_type'] = 6;
//        $message_content_data['title'] = "--等待医生接诊--";
//        $message_content_data['desc'] = "温馨提示：您可继续补充问诊内容，便于更快确认病情，医生均在临床一线工作，还请耐心等待，医生接诊会第一时间短信通知您。";
//        $message_content_data['data'] = [
//            "order_inquiry_id" => "499313028868112385",
//            "order_prescription_id" => "498938545791315968",
//            "product_name" => "测试药品",
//            "pharmacist_verify_time" => date('Y-m-d H:i:s',time()),
//        ];
//        $message_content = [
//            'Data' => json_encode($message_content_data,JSON_UNESCAPED_UNICODE),
//        ];
//
//        $ImService->sendMessage($user_doctor['user_id'], $order_inquiry['user_id'], $message_content, "TIMCustomElem", $cloud_custom_data);



//        $data = array();
//        $data['order_inquiry_id'] = "499654588596031489";
//
//        $message = new AssignDoctorProducer($data);
//        $producer = ApplicationContext::getContainer()->get(Producer::class);
//        $result = $producer->produce($message);


    }

    public function test_11(){

        $oss = new Oss();

        $filename = "basic/file/prescription.jpg";
        $sign_image = $oss->getObjectToRAM($filename);

        $manager = new ImageManager();

        $image = $manager->make($sign_image);

        $fontPath = './extend/Ca/ZiYuYongSongTi-2.ttf';

        // 处方号
        $image->text('1234567890', 1480, 540, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 日期
        $image->text('2023-03-21', 354, 675, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 科室
        $image->text('测试科室1', 1385, 675, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 姓名
        $image->text('测试姓名', 354, 795, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 性别
        $image->text('男', 1385, 790, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 年龄
        $image->text('19', 354, 900, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 过敏史
        $image->text('对阿莫西林过敏对阿莫西林过敏', 405, 1030, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 初步诊断
        $image->text('对阿莫西林过敏对阿莫西林过敏', 445, 1145, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        // 医生建议
        $image->text('没有建议', 445, 1252, function ($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(60);
            $font->align('left');
        });

        $data = array();
        $data['product'] = [
            [
                "product_name" => "感冒药1（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
            [
                "product_name" => "感冒药2（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
            [
                "product_name" => "感冒药3（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
            [
                "product_name" => "感冒药4（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
            [
                "product_name" => "感冒药5（50ml*10）",
                "single_unit" => "一次一包",
                "frequency_use" => "1天3次",
                "single_use" => "口服",
                "prescription_product_num" => "X1盒",
            ],
        ];

        // 用药
        foreach ($data['product'] as $key => $item){
            $x_axis = 229;
            $y_axis = 1600 + $key * 250;
            $x_axis_num = 1900;// 数量使用

            $image->text($item['product_name'], $x_axis, $y_axis, function ($font) use($fontPath) {
                $font->file($fontPath);
                $font->size(50);
                $font->align('left');
            });

            $image->text("X1盒", $x_axis_num, $y_axis, function ($font) use($fontPath) {
                $font->file($fontPath);
                $font->size(50);
                $font->align('left');
            });

            $image->text("用量：" . $item['single_unit'] . " " . $item['frequency_use'], $x_axis, $y_axis+70, function ($font) use($fontPath) {
                $font->file($fontPath);
                $font->size(50);
                $font->align('left');
            });

            $image->text("用法：" . $item['single_use'], $x_axis, $y_axis+140, function ($font) use($fontPath) {
                $font->file($fontPath);
                $font->size(50);
                $font->align('left');
            });


        }

        // 将处理后的图片重新保存到其他路径
        $image->save('./runtime/2.jpg');
    }
}