package lingtao.net.Factory;

import lingtao.net.bean.Product;
import lingtao.net.vo.PricingListVo;
import lingtao.net.vo.ProductVo;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 提供不干胶产品的定价策略。
 * 该类主要用于处理贴纸产品价格的计算，根据不同的用户角色提供相应的价格策略。
 */
public class StickerPricingStrategy implements PricingStrategy {

    /**
     * 根据用户角色计算产品价格。
     * 此方法旨在根据不同用户的角色对产品进行定价，但当前实现尚未完成。
     *
     * @param dto  产品信息的传输对象，包含需要计算价格的产品数据。
     * @param role 用户角色，用于确定适用的定价策略。
     * @return 返回经过计算价格更新后的产品列表，当前实现返回null。
     */
    @Override
    public PricingListVo calculatePrice(Product dto, String role) {
        String plantName = dto.getPlantName();
        double width = dto.getWidth();
        double length = dto.getLength();
        int count = dto.getCount();
        int number = dto.getNumber();
        // 定义纸张尺寸（单位：毫米）
        double paperLength = 280; // 纸张长度
        double paperWidth = 420;  // 纸张宽度
        String basePrice = "0"; // 基础价格
        BigDecimal price = new BigDecimal(0); // 最终价格
        length = convertToMillimetersWithMargin(length);
        width = convertToMillimetersWithMargin(width);
        int requiredSheets = 0;
        List<ProductVo> resultList = new ArrayList<>();

        if ("艾印".equals(plantName) || "即客".equals(plantName)) {
            Map<String, String> kindValuePrice = new HashMap<String, String>() {{
                put("0", "2.3"); //铜版纸不干胶
                put("1", "2.9"); //pvc不干胶
                put("2", "2.9"); //透明不干胶
                put("3", "2.3"); //牛皮纸
                put("5", "3.2"); //哑金不干胶
                put("6", "3.2"); //哑银不干胶
                put("7", "2.7"); //书写纸不干胶
                put("亮金", "3.2"); //
                put("亮银", "3.2"); //
                put("珠光冰白纸", "3.2"); //
                put("美纹纸", "2.8"); //
                put("拉丝金", "3.3"); //
                put("拉丝银", "3.3"); //
                put("易碎纸不干胶", "3.7"); //
                put("PP合成纸", "2.9"); //
                put("刚古水纹超白", "2.8"); //
            }};
            if ("即客".equals(plantName)) {
                kindValuePrice.put("树纹纸", "3.3");
                kindValuePrice.put("银平光", "3.6");
                kindValuePrice.put("白散金", "2.8");
                kindValuePrice.put("红洒金", "2.8");
                kindValuePrice.put("布纹纸超白", "5");
                kindValuePrice.put("草香纸", "3");
            }
            if (!kindValuePrice.containsKey(dto.getKindValue())) {
                return new PricingListVo(100, "暂不支持该产品");

            }
            basePrice = kindValuePrice.get(dto.getKindValue());
            // 检查是否超出纸张尺寸限制
            if (!isWithinPaperSize(length, width, paperLength, paperWidth)) {
                return new PricingListVo(100, "超出纸张尺寸限制"); // 返回空列表表示不适用
            }

            // 计算一张纸能容纳的最大金属标数量
            double maxItemsPerSheet = calculateMaxItemsPerSheet(length, width, paperLength, paperWidth);

            // 计算所需纸张数量
            requiredSheets = calculateRequiredSheets(count, number, maxItemsPerSheet);

            price = new BigDecimal(basePrice).multiply(new BigDecimal(requiredSheets)).setScale(2, RoundingMode.HALF_UP);


        }
        if ("欣海信".equals(dto.getPlantName())) {
            paperLength = 390; // 纸张长度
            paperWidth = 272;  // 纸张宽度

            // 检查是否超出纸张尺寸限制
            if (!isWithinPaperSize(length, width, paperLength, paperWidth)) {
                return new PricingListVo(100, "超出纸张尺寸限制"); // 返回空列表表示不适用
            }

            // 计算一张纸能容纳的最大金属标数量
            double maxItemsPerSheet = calculateMaxItemsPerSheet(length, width, paperLength, paperWidth);

            // 计算所需纸张数量
            requiredSheets = calculateRequiredSheets(count, number, maxItemsPerSheet);
            BigDecimal paperCount = new BigDecimal(requiredSheets);
            BigDecimal yinbai = new BigDecimal("0");
            //铜版纸
            if ("0".equals(dto.getKindValue())) {
                basePrice = "2.5";

            } else {
                basePrice = "4";
            }
            if ("印白墨".equals(dto.getYinbai())) {
                yinbai = "0".equals(dto.getKindValue()) ? new BigDecimal("20") : new BigDecimal("22");
            }
            price = new BigDecimal(basePrice).multiply(paperCount).setScale(2, RoundingMode.HALF_UP);
            price = price.add(yinbai.multiply(paperCount)).setScale(2, RoundingMode.HALF_UP);
            if (dto.getN_mq_num() > 0) {
                price = price.add(paperCount).setScale(2, RoundingMode.HALF_UP);
            }

        }
        if ("彩印通".equals(dto.getPlantName())) {
            Map<String, String> kindValuePrice = new HashMap<String, String>() {{
                put("0", "2"); //铜版纸不干胶
                put("1", "3.2"); //pvc不干胶
                put("2", "3.2"); //透明不干胶
                put("3", "2.5"); //牛皮纸
                put("5", "3.5"); //哑金不干胶
                put("6", "3.5"); //哑银不干胶
                put("7", "3"); //书写纸不干胶
                put("亮金", "3.5"); //
                put("亮银", "4"); //
                put("珠光冰白纸", "3.5"); //
                put("美纹纸", "2.5"); //
                put("红洒金", "3.5"); //
                put("布纹纸超白", "3.5"); //
                put("刚古水纹超白", "3.5"); //
                put("银平光", "4"); //
                put("拉丝金", "3.5"); //
                put("拉丝银", "3.5"); //
                put("易碎纸不干胶", "4"); //
                put("PP合成纸", "3.2"); //
                put("草香纸", "3.5"); //
                put("树纹纸", "3.5"); //
                put("白散金", "3.5"); //
                put("飘金超白不干胶", "3.5"); //
                put("美纹纸散金", "3.5"); //
            }};
            if ("0".equals(dto.getKindValue())) {
                paperLength = 450; // 纸张长度
                paperWidth = 320;  // 纸张宽度
            } else {
                paperLength = 420; // 纸张长度
                paperWidth = 297;  // 纸张宽度
            }
            if (!kindValuePrice.containsKey(dto.getKindValue())) {
                return new PricingListVo(100, "暂无报价"); // 返回空列表表示不适用
            }
            if (!isWithinPaperSize(length, width, paperLength, paperWidth)) {
                return new PricingListVo(100, "出纸张尺寸限制"); // 返回空列表表示不适用
            }
            basePrice = kindValuePrice.get(dto.getKindValue());
            // 计算一张纸能容纳的最大金属标数量
            double maxItemsPerSheet = calculateMaxItemsPerSheet(length, width, paperLength, paperWidth);

            // 计算所需纸张数量
            requiredSheets = calculateRequiredSheets(count, number, maxItemsPerSheet);
            BigDecimal yinbai = new BigDecimal("0");
            if ("印白墨".equals(dto.getYinbai())) {
                yinbai = "2".equals(dto.getKindValue()) ? new BigDecimal("6.2") : new BigDecimal("3");
            }
            BigDecimal paperCount = new BigDecimal(requiredSheets);
            price = new BigDecimal(basePrice).multiply(paperCount).setScale(2, RoundingMode.HALF_UP);
            price = price.add(yinbai.multiply(paperCount)).setScale(2, RoundingMode.HALF_UP);
        }
        ProductVo pro = new ProductVo();
        pro.setPrice(price.doubleValue());
        pro.setCount(count);

//        if ("1".equals(dto.getKindValue())) {
//            pro.setWeight(BigDecimal.valueOf(number * length / 100 * width / 100 * requiredSheets * 0.3).setScale(2, RoundingMode.HALF_UP).toString());
//        } else {
//            pro.setWeight(BigDecimal.valueOf(number * length / 100 * width / 100 * requiredSheets * 0.24).setScale(2, RoundingMode.HALF_UP).toString());
//        }

        pro.setWeight(BigDecimal.valueOf(number * length / 1000 * width / 1000 * count * 0.21 * 1.16).setScale(2, RoundingMode.HALF_UP).toString());
        // 创建产品对象并添加到结果列表
        resultList.add(pro);
        return new PricingListVo(resultList);
    }

    /**
     * 将给定的尺寸转换为毫米，并在每边增加3毫米的边距
     *
     * @param size 需要转换的原始尺寸
     * @return 转换后的尺寸，单位为毫米，包括边距
     */
    private double convertToMillimetersWithMargin(double size) {
        return size * 10 + 2 * 2; // 换成毫米，每边+2
    }

    /**
     * 检查给定的长度和宽度是否在纸张尺寸范围内
     *
     * @param length      需要检查的长度
     * @param width       需要检查的宽度
     * @param paperLength 纸张的长度
     * @param paperWidth  纸张的宽度
     * @return 如果给定尺寸在纸张尺寸范围内，则返回true；否则返回false
     */
    private boolean isWithinPaperSize(double length, double width, double paperLength, double paperWidth) {
        return (length <= paperLength && width <= paperWidth) || (length <= paperWidth && width <= paperLength);
    }

    /**
     * 计算每张纸最多可以容纳的物品数量
     *
     * @param length      物品的长度
     * @param width       物品的宽度
     * @param paperLength 纸张的长度
     * @param paperWidth  纸张的宽度
     * @return 每张纸最多可以容纳的物品数量
     */
    private double calculateMaxItemsPerSheet(double length, double width, double paperLength, double paperWidth) {
        return Math.max(
                Math.floor(paperLength / length) * Math.floor(paperWidth / width),
                Math.floor(paperLength / width) * Math.floor(paperWidth / length)
        );
    }

    /**
     * 计算完成指定数量的物品所需的纸张数量
     *
     * @param count            物品的总数量
     * @param number           每个物品需要的数量
     * @param maxItemsPerSheet 每张纸最多可以容纳的物品数量
     * @return 完成指定数量的物品所需的纸张数量
     */
    private int calculateRequiredSheets(int count, int number, double maxItemsPerSheet) {
        return (int) Math.ceil((count * number) / maxItemsPerSheet);
    }
}
