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.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

/**
 * 班级标志定价策略类
 * 实现了PricingStrategy接口，用于根据用户角色计算产品价格
 * 此策略专注于处理与班级标志相关的产品价格计算
 */
public class ClassFlagPricingStrategy 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 price = 0.0;
        double basePrice = 0.0;
        List<ProductVo> resultList = new ArrayList<>();
        List<String> craft_list = Optional.ofNullable(dto)
                .map(Product::getCraft) // 假设 dto 是 Dto 类型
                .map(Arrays::asList)
                .orElseGet(ArrayList::new);

        // 确保 craftList 是可变的
        craft_list = new ArrayList<>(craft_list);
        if ("领鸿".equals(plantName)) {
            //旗帜布
            basePrice = 6.5;
            double area = Math.max(count * number * width * length / 10000, 0.3);
            price = new BigDecimal(basePrice * area).setScale(2, RoundingMode.HALF_UP).doubleValue();
            if (craft_list.contains("旗杆")) {
                price = BigDecimal.valueOf(price).add(BigDecimal.valueOf(count * number * 15.0)).setScale(2, RoundingMode.HALF_UP).doubleValue();
            }
        }

        ProductVo pro = new ProductVo();
        pro.setCount(count);
        pro.setPrice(price);
        pro.setNumber(number);
        pro.setWeight(BigDecimal.valueOf(width / 100 * length / 100 * count * 0.07).setScale(2, BigDecimal.ROUND_HALF_UP).toString());
        resultList.add(pro);
        return new PricingListVo(resultList);
    }
}
