<?php

namespace App\Admin\Controllers;

use App\Models\PatientModel;
use App\Models\PharmacyDrugModel;
use App\Models\PrescriptionModel;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Layout\Content;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\Laravel\Facades\Image;

// 药店-处方打印
class PrescriptionPrintController extends AdminController
{
    // 处方打印首页，显示输入框，可以搜索处方
    public function index(Content $content): Content
    {
        // 加载处方打印页面
        return $content->header('处方打印')
            ->description('根据处方编号搜索并打印处方')
            ->body(view('admin.prescription-print'));
    }

    /**
     * 根据处方编号搜索处方并生成图片
     */
    public function search()
    {
        $prescriptionNo = request('prescription_no');
        $printEseal = request('print_eseal', 0); // 是否打印电子印章，实时生成

        if (empty($prescriptionNo)) {
            return response()->json([
                'status' => false,
                'message' => '请输入处方编号',
            ]);
        }

        try {
            // 获取处方信息
            $prescription = PrescriptionModel::where('id', $prescriptionNo)->first();
            if (! $prescription) {
                return response()->json(['status' => false, 'message' => '未找到该处方']);
            }
            // 检查处方图片是否已经生成
            if ($printEseal && $prescription->prescription_pic_eseal) {
                return response()->json([
                    'status' => true,
                    'data' => [
                        'img_url' => Storage::url($prescription->prescription_pic_eseal),
                    ],
                ]);
            } elseif ($prescription->prescription_pic) {
                return response()->json([
                    'status' => true,
                    'data' => [
                        'img_url' => Storage::url($prescription->prescription_pic),
                    ],
                ]);
            }

            // 创建处方图片
            // 处方背景图宽1653，高2339
            $img = Image::read(public_path('static/images/chufangdan.jpg'));

            $imageWidth = 1653;
            $centerX = $imageWidth / 2; // 手动调整 X 坐标以居中
            // 医院
            $img->text($prescription->doctor_online_hospital_name, $centerX, 70, function ($font) {
                $font->filename(public_path('static/fonts/SimHei.ttf'));
                $font->size(72);
                $font->color('#000000');
                $font->align('center'); // 使用 align('center') 以确保文本相对于 X 坐标居中
                $font->valign('top');   // 确保文本垂直对齐方式
            });
            // 处方单编号
            $img->text("处方单编号：{$prescription->id}", 1170, 190, function ($font) {
                $font->filename(public_path('static/fonts/SimHei.ttf'));
                $font->size(24);
                $font->color('#000000');
            });
            // 姓名
            $img->text($prescription->patient_name, 410, 260, function ($font) {
                $font->filename(public_path('static/fonts/SimHei.ttf'));
                $font->size(32);
                $font->color('#000000');
            });
            // 性别
            $gender = PatientModel::SEX_MAP[$prescription->patient_gender];
            $img->text($gender, 890, 260, function ($font) {
                $font->filename(public_path('static/fonts/SimHei.ttf'));
                $font->size(32);
                $font->color('#000000');
            });
            // 年龄
            $img->text("{$prescription->patient_age}岁", 1270, 260, function ($font) {
                $font->filename(public_path('static/fonts/SimHei.ttf'));
                $font->size(32);
                $font->color('#000000');
            });
            // 开放日期
            $date = \Carbon\Carbon::parse($prescription->prescription_at)->format('Y-m-d');
            $img->text($date, 1215, 330, function ($font) {
                $font->filename(public_path('static/fonts/SimHei.ttf'));
                $font->size(32);
                $font->color('#000000');
            });
            // 诊断
            $img->text($prescription->diagnosis_name, 330, 460, function ($font) {
                $font->filename(public_path('static/fonts/SimHei.ttf'));
                $font->size(32);
                $font->color('#000000');
            });

            $drugInfo = $prescription->drug_info; // 每个元素包含 'pharmacy_drug', 'num'
            $drugInfo = json_decode($drugInfo, true);
            $medicines = [];
            foreach ($drugInfo as $v) {
                $pharmacyDrug = PharmacyDrugModel::with(['drug', 'dosage'])->find($v['pharmacy_drug']);
                $medicines[] = [
                    'name' => $pharmacyDrug->drug->name,
                    'spec' => $pharmacyDrug->drug->spec,
                    'num' => $v['num'],
                    'sig' => $pharmacyDrug->dosage->dosage_desc,
                ];
            }

            // 初始 Y 坐标
            $yCoordinate = 650; // 根据需要调整初始 Y 坐标

            foreach ($medicines as $medicine) {
                // 打印药品名称、规格和盒数
                $medicineText = "{$medicine['name']}     {$medicine['spec']}      {$medicine['num']}{$pharmacyDrug->unit}";
                $img->text($medicineText, 550, $yCoordinate, function ($font) {
                    $font->filename(public_path('static/fonts/SimHei.ttf'));
                    $font->size(32);
                    $font->color('#000000');
                    $font->align('center');
                });

                // 增加 Y 坐标以打印下一行
                $yCoordinate += 40; // 根据字体大小调整行间距

                // 打印 sig 信息
                $img->text('Sig：  '.$medicine['sig'], 550, $yCoordinate, function ($font) {
                    $font->filename(public_path('static/fonts/SimHei.ttf'));
                    $font->size(32);
                    $font->color('#000000');
                    $font->align('center');
                });

                // 增加 Y 坐标以准备打印下一个药品
                $yCoordinate += 60; // 根据字体大小调整行间距
            }

            // 打印两行空白
            $yCoordinate += 30; // 空白行间距
            $yCoordinate += 30; // 空白行间距

            // 打印“以下空白”文字
            $img->text('以下空白', 650, $yCoordinate, function ($font) {
                $font->filename(public_path('static/fonts/SimHei.ttf'));
                $font->size(32);
                $font->color('#000000');
                $font->align('center');
            });

            // 医师签名图片
            if ($prescription->doctor_signed_pic) {
                $pharmacistSignPath = Storage::url($prescription->doctor_signed_pic);
                $doctorSign = Image::read(file_get_contents($pharmacistSignPath));
                $doctorSign->rotate(90);
                $doctorSign->resize(150, 100);
                $img->place($doctorSign, 'bottom-left', 400, 410);
            }
            // 药师签名图片
            if ($prescription->pharmacist_signed_pic) {
                $pharmacistSignPath = Storage::url($prescription->pharmacist_signed_pic);
                $pharmacistSign = Image::read(file_get_contents($pharmacistSignPath));
                $pharmacistSign->rotate(90);
                $pharmacistSign->resize(150, 100);
                $img->place($pharmacistSign, 'bottom-left', 870, 410);
            }
            // 不带印章处方图片生成
            $picName = $prescriptionNo.'.jpg';
            $tempPath = storage_path('app/public').$picName;
            $img->save($tempPath); // 不带电子印章
            // 上传到腾讯云
            Storage::putFileAs('prescriptions', $tempPath, $picName);

            // 电子印章版处方图片生成
            $eseal = Image::read(public_path('static/images/dianzizhang.png'));
            // $eseal->rotate(90);
            $eseal->resize(150, 150);
            $img->place($eseal, 'bottom-right', 180, 500);
            $picEsealName = $prescriptionNo.'-eseal.jpg';
            $tempEsealPath = storage_path('app/public').$picEsealName;
            $img->save($tempEsealPath);
            // 上传到腾讯云
            Storage::putFileAs('prescriptions', $tempEsealPath, $picEsealName);

            // 删除临时文件
            unlink($tempPath);
            unlink($tempEsealPath);

            $cosPath = "prescriptions/{$picName}";
            $cosEsealPath = "prescriptions/{$picEsealName}";

            // 将生成的处方图片路径存储到数据库
            $prescription->prescription_pic = $cosPath;
            $prescription->prescription_pic_eseal = $cosEsealPath;
            $prescription->save(); // 保存处方图片路径

            if ($printEseal = true) {
                $imgUrl = Storage::url($cosEsealPath);
            } else {
                $imgUrl = Storage::url($cosPath);
            }

            return response()->json([
                'status' => true,
                'data' => [
                    'img_url' => $imgUrl,
                ],
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'status' => false,
                'message' => '处方生成失败:'.$e->getMessage(),
            ]);
        }
    }
}
