package com.hxhq.business.utils.pdf.resource;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hxhq.business.domain.GyzjJcgj;
import com.hxhq.business.domain.GyzjTz;
import com.hxhq.business.dto.gyzj.DetailDto;
import com.hxhq.business.enums.zykgl.ZjztEnum;
import com.hxhq.business.utils.lang.GyzjJcnrUtil;
import com.hxhq.business.utils.pdf.PdfBaseUtil;
import com.hxhq.business.utils.pdf.PdfExportUtil;
import com.hxhq.common.core.utils.StringUtils;
import com.hxhq.common.security.utils.SecurityUtils;
import com.hxhq.system.api.model.LoginUser;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.*;

/**
 * 给药制剂详情
 *
 * @author tanfei
 */
public class Dosage {
    private static final Logger logger = LoggerFactory.getLogger(Dosage.class.getName());
    public String language="zh";
    /**
     * 导出
     *
     * @param gyzj
     * @return
     */
    public String exportDetail(DetailDto gyzj, List<GyzjTz> gyzjTzList, List<GyzjJcgj> gyzjJcgjList, String lang, String localFilePath) {
        language=lang;
        Document document = null;
        FileOutputStream fos = null;
        String filePath = PdfBaseUtil.getFilePath(localFilePath,"Dosage");
        try {
            String sign = "hxhq";
            LoginUser loginUser = SecurityUtils.getLoginUser();
            if (loginUser != null) {
                sign = loginUser.getSysUser().getNickName();
            }
            document = PdfBaseUtil.init(document, fos, filePath, sign + PdfExportUtil.parseDateToStr(new Date()), getName("给药制剂详情"),false);
            // 基本信息
            PdfBaseUtil.addUnderlinedTitle(document, getName("基本信息"), 10, true);
            Map<String, String> formData1 = new LinkedHashMap<>();
            formData1.put(getName("名称"), gyzj.getMc());
            formData1.put(getName("编号"), gyzj.getBh());
            formData1.put(getName("浓度"), gyzj.getNd() + gyzj.getNddw());
            formData1.put(getName("库存量"), gyzj.getKc() + gyzj.getKcdw());
            formData1.put(getName("失效日期"), PdfExportUtil.parseDateToStr(gyzj.getSxrq()));
            formData1.put(getName("存储条件"), gyzj.getCctj());
            formData1.put(getName("存储位置"), gyzj.getCcwz());
            formData1.put(getName("制剂状态"), "en".equals(language) ? (GyzjJcnrUtil.getEn(ZjztEnum.getEnumByValue(gyzj.getZjzt()).getText())) : ZjztEnum.getEnumByValue(gyzj.getZjzt()).getText());
            PdfBaseUtil.addFormTableColumns(document, formData1, 2);
            // 表单信息
            PdfBaseUtil.addUnderlinedTitle(document, getName("表单信息"), 10, true);
            Map<String, String> formData3 = new LinkedHashMap<>();
            formData3.put(getName("表单所属试验"), gyzj.getStudyMc());
            formData3.put(getName("所属表单"), gyzj.getBdMc());
            formData3.put(getName("表单所属人"), gyzj.getBdgsrMc());
            PdfBaseUtil.addFormTableColumns(document, formData3, 2);
            PdfBaseUtil.addUnderlinedTitle(document, getName("给药制剂台账") , 10, true);
            // 台账
            addTz(document, gyzjTzList, lang);
            PdfBaseUtil.addUnderlinedTitle(document, getName("稽查轨迹") , 10, true);
            //稽查轨迹
            addJcgj(document, gyzjJcgjList, lang);
            logger.info("生成成功：{}", filePath);
        } catch (Exception e) {
            logger.error("生成失败", e);
            throw new RuntimeException("生成失败: " + e.getMessage());
        } finally {
            if (document != null) {
                document.close();
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    logger.error("关闭文件流失败", e);
                }
            }
        }
        return filePath;
    }

    /**
     * 台账
     *
     * @param document
     * @param gyzjTzList
     * @throws IOException
     * @throws DocumentException
     */
    public void addTz(Document document, List<GyzjTz> gyzjTzList, String lang) throws IOException, DocumentException {

        // 9. 表头
        BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        Font headerFont = new Font(bfChinese, 8, Font.NORMAL);
        Font contentFont = new Font(bfChinese, 8, Font.NORMAL);
        // 8. 创建表格
        PdfPTable table = new PdfPTable(8);
        table.setWidthPercentage(100);
        String[] headers = {getName("使用人"),getName("领取/归还人/入库申请人"),getName("发放/接收人"),getName("操作类型"),getName("表单名称"),getName("操作量"),getName("备注/原因"),getName("操作时间")};
        for (String header : headers) {
            PdfPCell cell = new PdfPCell(new Phrase(header, headerFont));
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setPadding(8);
            cell.setBorderWidth(1);
            table.addCell(cell);
        }
        int rowNum = 0;
        for (GyzjTz gyzjTz : gyzjTzList) {
            // 交替行颜色
            if (rowNum % 2 == 0) {
                table.getDefaultCell().setBackgroundColor(BaseColor.WHITE);
            } else {
                table.getDefaultCell().setBackgroundColor(BaseColor.WHITE);
            }
            table.addCell(PdfBaseUtil.createCell(gyzjTz.getQmrMc(), contentFont));
            table.addCell(PdfBaseUtil.createCell(StringUtils.isNoneBlank(gyzjTz.getLqrMc()) ? gyzjTz.getLqrMc() : "" + (StringUtils.isNoneBlank(gyzjTz.getGhrMc()) ? gyzjTz.getGhrMc() : ""), contentFont));
            table.addCell(PdfBaseUtil.createCell(StringUtils.isNoneBlank(gyzjTz.getFfrMc()) ? gyzjTz.getFfrMc() : "" + (StringUtils.isNoneBlank(gyzjTz.getJsrMc()) ? gyzjTz.getJsrMc() : ""), contentFont));
            table.addCell(PdfBaseUtil.createCell(gyzjTz.getQmyy(), contentFont));
            table.addCell(PdfBaseUtil.createCell(gyzjTz.getBdMc(), contentFont));
            table.addCell(PdfBaseUtil.createCell(gyzjTz.getCzl() + gyzjTz.getCzldw(), contentFont));
            table.addCell(PdfBaseUtil.createCell(gyzjTz.getRemark(), contentFont));
            table.addCell(PdfBaseUtil.createCell(PdfExportUtil.parseDateToStr(gyzjTz.getCreateTime()), contentFont));
            rowNum++;
        }
        document.add(table);
    }

    /**
     * 稽查轨迹
     *
     * @param document
     * @param gyzjJcgjList
     * @throws IOException
     * @throws DocumentException
     */
    public void addJcgj(Document document, List<GyzjJcgj> gyzjJcgjList, String lang) throws IOException, DocumentException {
        for (GyzjJcgj jcgj : gyzjJcgjList) {
            StringJoiner result = new StringJoiner(", ");
            if ("en".equals(lang)) {
                PdfBaseUtil.addUnderlinedTitle(document, PdfExportUtil.parseDateToStr(jcgj.getCreateTime())+ "     " + jcgj.getJcmcEn(), 10, false);
                if (StringUtils.isNoneBlank(jcgj.getJcnrEn())) {
                    ObjectMapper mapper = new ObjectMapper();
                    JsonNode jsonArray = mapper.readTree(jcgj.getJcnrEn());
                    for (JsonNode node : jsonArray) {
                        if (node.get("name") != null) {
                            String name = node.get("name").asText();
                            String value = node.get("value")!=null? node.get("value").asText():"";
                            result.add(name + "：" + value);
                        }
                    }
                }
            } else {
                PdfBaseUtil.addUnderlinedTitle(document, PdfExportUtil.parseDateToStr(jcgj.getCreateTime())+ "     " + jcgj.getJcmc(), 10, false);
                if (StringUtils.isNoneBlank(jcgj.getJcnr())) {
                    ObjectMapper mapper = new ObjectMapper();
                    JsonNode jsonArray = mapper.readTree(jcgj.getJcnr());
                    for (JsonNode node : jsonArray) {
                        if (node.get("name") != null) {
                            String name = node.get("name").asText();
                            String value =node.get("value")!=null? node.get("value").asText():"";
                            result.add(name + "：" + value);
                        }
                    }
                }
            }
            if (StringUtils.isNoneBlank(jcgj.getRemark())) {
                result.add(getName("备注")+"：" + jcgj.getRemark());
            }
            if (StringUtils.isNoneBlank(jcgj.getQmrMc())) {
                result.add(getName("签名人")+"："  + jcgj.getQmrMc());
            }
            PdfBaseUtil.addUnderlinedTitle(document, result.toString(), 10, false);
        }
    }

    /**
     * 获取名称
     * @param name
     * @return
     */
    public String getName(String name){
       return  "en".equals(language) ? GyzjJcnrUtil.getEn(name) : name;
    }


}
