<?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');

        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 ($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);
        }

        // 将图片保存到临时文件
        $tempPath = storage_path('app/public').$prescriptionNo.'.jpg';
        $img->save($tempPath);

        // 上传到腾讯云
        Storage::putFileAs('prescriptions', $tempPath, $prescriptionNo.'.jpg');

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

        $cosPath = 'prescriptions/'.$prescriptionNo.'.jpg';

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

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