package com.bohuikeji.delivery.backstage.constants;

import com.alibaba.fastjson.JSONObject;
import com.bohuikeji.delivery.backstage.entity.TOrder;
import com.bohuikeji.delivery.backstage.entity.discount.TDiscountMall;
import com.bohuikeji.delivery.backstage.entity.discount.TDiscountPattern;
import com.bohuikeji.delivery.backstage.entity.discount.TDiscountRecord;
import com.bohuikeji.frame.module.admin.utils.MinioUtil;
import com.freewayso.image.combiner.ImageCombiner;
import com.freewayso.image.combiner.enums.OutputFormat;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.time.DateUtils;

import java.awt.*;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.*;
import java.util.List;

/**
 * 优惠图片模板设置
 */
@Slf4j
public class discountConst {


    /**
     * 会员新增修改会员卡时设置图片
     * @param discountMall
     * @param discountPatterns
     * @return
     * @throws IOException
     */
    public static JSONObject getMemberUrl(TDiscountMall discountMall, List<TDiscountPattern> discountPatterns) throws Exception {
        JSONObject jsonObject = new JSONObject(discountPatterns.size());
        String type=null;
        for(TDiscountPattern discountPattern : discountPatterns){
            switch (discountPattern.getDescription()){
                case "列表模板":
                    jsonObject.put("templateList",discountConst.getMemberDisUrl(discountMall,discountPattern));break;
                case "详情模板":
                    jsonObject.put("templateDetails",discountConst.getMemberDisUrl(discountMall,discountPattern));break;
                case "展示模板":
                    jsonObject.put("templateDis",discountConst.getMemberDisUrl(discountMall,discountPattern));break;
                default:
                    return null;
            }
        }
        log.info("模板地址：[{}]",jsonObject);
        return jsonObject;
    }


    /**
     * 优惠卷弹框模板
     * @param discountMall
     * @return
     * @throws IOException
     */
    /*public static String frameTemplate(TDiscountMall discountMall,String url) throws IOException {
        Font font1 = new Font("微软雅黑", Font.BOLD, 40);
        Font font2 = new Font("微软雅黑", Font.BOLD, 40);
        Font font3 = new Font("微软雅黑", Font.PLAIN, 26);
        InputStream murl = FileUtil.download(url);
        BufferedImage sourceImg = ImageIO.read(murl);
        Graphics2D  g = sourceImg.createGraphics();
        switch (discountMall.getDisMode()){
            case "弹框":
                g.setColor(Color.WHITE);
                g.setFont(font1);
                g.drawString(discountMall.getDisType(),90,270);
                g.setFont(font2);
                g.drawString(discountMall.getDisValue().setScale( 0, BigDecimal.ROUND_DOWN).toString()+"元",330,240);
                g.setFont(font3);
                g.drawString(discountMall.getDisRemark(),300,290);break;
            case "立减弹框":
                g.setColor(Color.WHITE);
                g.setFont(font2);
                g.drawString(discountMall.getDisValue().setScale( 0, BigDecimal.ROUND_DOWN).toString()+"元",460,410);
                g.setFont(font3);
                g.drawString(discountMall.getDisRemark(),200,410);break;
            case "满减弹框":
                g.setColor(Color.WHITE);
                g.setFont(new Font("微软雅黑", Font.BOLD, 60));
                g.drawString(discountMall.getDisValue().setScale( 0, BigDecimal.ROUND_DOWN).toString(),280,380);
                g.setFont(new Font("微软雅黑", Font.BOLD, 30));
                g.drawString("元",320,380);
                g.setFont(font3);
                g.drawString(discountMall.getDisRemark(),240,430);break;
            case "折扣弹框":
                g.setColor(Color.RED);
                g.setFont(font2);
                g.drawString(discountMall.getDisValue().setScale( 0, BigDecimal.ROUND_DOWN).toString()+"元",230,320);
                g.setFont(font3);
                g.drawString(discountMall.getDisRemark(),200,370);break;
            case "万能弹框":
                g.setColor(Color.WHITE);
                g.setFont(font1);
                g.drawString(discountMall.getDisType(),90,270);
                g.setFont(font2);
                g.drawString(discountMall.getDisValue().setScale( 0, BigDecimal.ROUND_DOWN).toString()+"元",280,400);
                g.setFont(font3);
                g.drawString(discountMall.getDisRemark(),240,460);break;
            default:
                return null;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ImageIO.write(sourceImg, "png", out);
        InputStream  sbs = new ByteArrayInputStream(out.toByteArray());
        String templateUrl = MinioUtil.uploadFileB(sbs,".png");
        log.info("优惠卷信息33:[{}]",discountMall);
        return templateUrl;
    }*/

    public static String frameTemplate(TDiscountMall discountMall,String url) throws Exception {
        //创建合成器（指定背景图和输出格式，整个图片的宽高和相关计算依赖于背景图，所以背景图的大小是个基准）
        ImageCombiner combiner = new ImageCombiner(url, OutputFormat.PNG);
        String company;
        if("折扣卷".equals(discountMall.getDisType())){
            company="折";
        }else {
            company="元";
        }
        switch (discountMall.getDisSign()){
            case "弹框":
                //标题（默认字体为阿里普惠、黑色，也可以自己指定Font对象）
                combiner.addTextElement(discountMall.getDisType(), "微软雅黑", 40, 90, 240).setColor(Color.WHITE); //绘制方向（从右到左，用于需要右对齐场景）
                //内容（设置文本自动换行，需要指定最大宽度（超出则换行）、最大行数（超出则丢弃）、行高）
                combiner.addTextElement(discountMall.getDisValue().setScale( 1, BigDecimal.ROUND_DOWN).toString()+ company, "微软雅黑", 40, 370, 210).setColor(Color.WHITE);//自动换行（还有一个LineAlign参数可以指定对齐方式）
                combiner.addTextElement(discountMall.getDisRemark(), "微软雅黑", 30, 320, 270).setColor(Color.WHITE);break;
            case "立减弹框":
                combiner.addTextElement(discountMall.getDisValue().setScale( 1, BigDecimal.ROUND_DOWN).toString()+"元", "微软雅黑", 40, 460, 380).setColor(Color.WHITE);//自动换行（还有一个LineAlign参数可以指定对齐方式）
                combiner.addTextElement(discountMall.getDisRemark(), "微软雅黑", 30, 200, 380).setColor(Color.WHITE);break;
            case "满减弹框":
                combiner.addTextElement(discountMall.getDisValue().setScale( 1, BigDecimal.ROUND_DOWN).toString()+"元", "微软雅黑", 50, 280, 330).setColor(Color.WHITE);//自动换行（还有一个LineAlign参数可以指定对齐方式）
                combiner.addTextElement(discountMall.getDisRemark(), "微软雅黑", 30, 240, 400).setColor(Color.WHITE);break;
            case "折扣弹框":
                combiner.addTextElement(discountMall.getDisValue().setScale( 1, BigDecimal.ROUND_DOWN).toString()+"折", "微软雅黑", 40, 230, 280).setCenter(true).setColor(Color.RED);//自动换行（还有一个LineAlign参数可以指定对齐方式）
                combiner.addTextElement(discountMall.getDisRemark(), "微软雅黑", 30, 160, 350).setCenter(true).setColor(Color.RED);break;
            case "万能弹框":
                combiner.addTextElement(discountMall.getDisValue().setScale( 1, BigDecimal.ROUND_DOWN).toString()+ company, "微软雅黑", 40, 280, 350).setCenter(true).setColor(Color.WHITE);//自动换行（还有一个LineAlign参数可以指定对齐方式）
                combiner.addTextElement(discountMall.getDisRemark(), "微软雅黑", 30, 240, 450).setCenter(true).setColor(Color.WHITE);break;
            default:
                return null;
        }
        //执行图片合并
        combiner.combine();
        //可以获取流（并上传oss等）
        InputStream is = combiner.getCombinedImageStream();
        String templateUrl = MinioUtil.uploadFileB(is,".png");
        log.info("优惠卷信息33:[{}]",discountMall);
        return templateUrl;
    }


    /**
     * 会员列表、详情、展示页设置
     * @param discountMall
     * @return
     * @throws IOException
     */
    public static String getMemberDisUrl(TDiscountMall discountMall,TDiscountPattern discountPattern) throws Exception {
        ImageCombiner combiner = new ImageCombiner(discountPattern.getTemplateUrl(), OutputFormat.PNG);
        if("列表模板".equals(discountPattern.getDescription())){
            combiner.addTextElement(discountMall.getDisValue().toString()+"折", 0, 36, 50).setFont(new Font("微软雅黑", Font.BOLD, 20)).setColor(Color.RED).setCenter(true);
            combiner.addTextElement(discountMall.getDisName(), 0, 36, 85).setFont(new Font("微软雅黑", Font.BOLD, 20)).setColor(Color.RED).setCenter(true);
            combiner.addTextElement(discountMall.getDisRemark(), 0, 25, 140).setFont(new Font("微软雅黑", Font.BOLD, 13)).setColor(Color.WHITE).setCenter(true);
        }
        if("详情模板".equals(discountPattern.getDescription())){
            combiner.addTextElement(discountMall.getDisName().substring(0,2)+"卡", 0, 160, 260).setFont(new Font("微软雅黑", Font.BOLD, 20)).setColor(Color.BLUE).setCenter(true);
            combiner.addTextElement(discountMall.getDisRemark(), 0, 110, 360).setFont(new Font("微软雅黑", Font.BOLD, 20)).setColor(Color.WHITE).setCenter(true);
        }
        if("展示模板".equals(discountPattern.getDescription())){
            combiner.addTextElement(discountMall.getDisName(), 0, 140, 45).setFont(new Font("微软雅黑", Font.BOLD, 20)).setColor(new Color(0xffcfbb8b));
            combiner.addTextElement("优惠额度", 0, 60, 160).setFont(new Font("方正粗黑宋简体", Font.BOLD, 18)).setColor(new Color(0xFF8E6C1B));
            combiner.addTextElement("截止日期", 0, 280, 160).setFont(new Font("方正粗黑宋简体", Font.BOLD, 18)).setColor(new Color(0xFF8E6C1B)).setCenter(true);
            combiner.addTextElement("优惠说明", 0, 500, 160).setFont(new Font("方正粗黑宋简体", Font.BOLD, 18)).setColor(new Color(0xFF8E6C1B));

            combiner.addTextElement(discountMall.getDisValue().setScale(1, BigDecimal.ROUND_DOWN)+"折", 0, 70, 220).setFont(new Font("华文中宋", Font.BOLD, 16)).setColor(new Color(0xFF8E6C1B));
            combiner.addTextElement(LocalDate.now().toString(), 0, 280, 200).setFont(new Font("华文中宋", Font.BOLD, 16)).setColor(new Color(0xFF8E6C1B)).setCenter(true);
            combiner.addTextElement("至", 0, 310, 220).setFont(new Font("华文中宋", Font.BOLD, 16)).setColor(new Color(0xFF8E6C1B)).setCenter(true);
            combiner.addTextElement(discountConst.getEndDate(discountMall.getDisName()).toString(), 0, 280, 240).setFont(new Font("华文中宋", Font.BOLD, 16)).setColor(new Color(0xFF8E6C1B)).setCenter(true);
            combiner.addTextElement(discountMall.getDisRemark(), 0, 470, 200).setFont(new Font("华文中宋", Font.BOLD, 16)).setColor(new Color(0xFF8E6C1B));
            combiner.addTextElement("不能与优惠卷一起使用", 0, 470, 230).setFont(new Font("华文中宋", Font.BOLD, 16)).setColor(new Color(0xFF8E6C1B));

        }
        //执行图片合并
        combiner.combine();
        //可以获取流（并上传oss等）
        InputStream is = combiner.getCombinedImageStream();
        String templateUrl = MinioUtil.uploadFileB(is,".png");
        log.info("优惠卷信息33:[{}]",discountMall);
        return templateUrl;
    }

    /**
     * 优惠卷列表图展示设置
     * @param discountMall
     * @return
     * @throws IOException
     */
    public static String getUrl(TDiscountMall discountMall,String url) throws Exception {
        ImageCombiner combiner = new ImageCombiner(url, OutputFormat.PNG);
        if("充值发放".equals(discountMall.getReceiveMethod())){
            switch (discountMall.getConsType()){
                case "急送":
                    combiner.addTextElement("￥", 0, 30, 30).setFont(new Font("微软雅黑", Font.BOLD, 25)).setColor(Color.WHITE);
                    combiner.addTextElement(discountMall.getDisValue().setScale( 1, BigDecimal.ROUND_DOWN).toString(), 0, 50, 60).setFont(new Font("微软雅黑", Font.BOLD, 50)).setColor(Color.WHITE).setCenter(true);
                    combiner.addTextElement(discountMall.getDisRemark(), 0, 30, 140).setFont(new Font("微软雅黑", Font.BOLD, 18)).setColor(Color.WHITE).setCenter(true);
                    break;
                case "快递":
                    combiner.addTextElement("￥", 0, 30, 50).setFont(new Font("微软雅黑", Font.BOLD, 25)).setColor(Color.WHITE);
                    combiner.addTextElement(discountMall.getDisValue().setScale( 1, BigDecimal.ROUND_DOWN).toString(), 0, 50, 60).setFont(new Font("微软雅黑", Font.BOLD, 50)).setColor(Color.WHITE).setCenter(true);
                    combiner.addTextElement(discountMall.getDisRemark(), 0, 30, 140).setFont(new Font("微软雅黑", Font.BOLD, 18)).setColor(Color.WHITE).setCenter(true);
                    break;
                case "跨城":
                    combiner.addTextElement("￥", 0, 40, 60).setFont(new Font("微软雅黑", Font.BOLD, 25)).setColor(Color.RED);
                    combiner.addTextElement(discountMall.getDisValue().setScale( 1, BigDecimal.ROUND_DOWN).toString(), 0, 50, 60).setFont(new Font("微软雅黑", Font.BOLD, 50)).setColor(Color.RED).setCenter(true);
                    combiner.addTextElement(discountMall.getDisRemark(), 0, 30, 130).setFont(new Font("微软雅黑", Font.BOLD, 16)).setColor(Color.RED).setCenter(true);
                    break;
                case "拉货":
                    combiner.addTextElement("￥", 0, 30, 50).setFont(new Font("微软雅黑", Font.BOLD, 25)).setColor(Color.RED);
                    combiner.addTextElement(discountMall.getDisValue().setScale( 1, BigDecimal.ROUND_DOWN).toString(), 0, 50, 60).setFont(new Font("微软雅黑", Font.BOLD, 50)).setColor(Color.RED).setCenter(true);
                    combiner.addTextElement(discountMall.getDisRemark(), 0, 40, 130).setFont(new Font("微软雅黑", Font.BOLD, 18)).setColor(Color.RED).setCenter(true);
                    break;
                default:
                    return null;
            }
        }
        if("免费赠送".equals(discountMall.getReceiveMethod())){
            combiner.addTextElement("￥", 0, 40, 40).setFont(new Font("微软雅黑", Font.BOLD, 30)).setColor(Color.WHITE);
            combiner.addTextElement(discountMall.getDisValue().setScale( 1, BigDecimal.ROUND_DOWN).toString(), 0, 70, 40).setFont(new Font("微软雅黑", Font.BOLD, 50)).setColor(Color.WHITE);
            combiner.addTextElement(discountMall.getDisType(), 0, 190, 45).setFont(new Font("微软雅黑", Font.BOLD, 20)).setColor(Color.WHITE);
            combiner.addTextElement(discountMall.getDisRemark(), 0, 170, 80).setFont(new Font("微软雅黑", Font.BOLD, 18)).setColor(Color.WHITE);
        }
        //执行图片合并
        combiner.combine();
        //可以获取流（并上传oss等）
        InputStream is = combiner.getCombinedImageStream();
        String templateUrl = MinioUtil.uploadFileB(is,".png");
        return templateUrl;
    }

    /**
     * 判断时间是否过期
     * @param collectiondate
     * @return
     * @throws ParseException
     */
    public static boolean comparisonTime(LocalDate collectiondate) throws ParseException {
        String toString = collectiondate.toString();
        String replace = toString.replace("T", " ");
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar rightNow = Calendar.getInstance();//当前时间
        Date dayOne = rightNow.getTime();
        //日期的DATE -1 ：就是往前推1天；同理 +1 就是往后推1天
        rightNow.add(Calendar.DATE, +1);//你要加减的日期
        Date parse = dateFormat.parse(replace);
        boolean flag = DateUtils.isSameDay(dayOne, parse);
        return flag;
    }

    /**
     * 优惠卷折扣计算
     * 订单金额 * 优惠的折扣 = 优惠的金额
     * @param order
     * @param discountRecord
     * @return
     */
    public static BigDecimal getDisPrice(TOrder order,TDiscountRecord discountRecord){
        BigDecimal disAmount;//优惠的金额
        if("折扣卷".equals(discountRecord.getDisType()) || "会员卡".equals(discountRecord.getDisType())){
            BigDecimal bignum = new BigDecimal("10.0");
            BigDecimal prenum =bignum.subtract(discountRecord.getDisValue());
            BigDecimal disPrice = prenum.divide(bignum,2,BigDecimal.ROUND_HALF_UP);
            disAmount = order.getOrderExpectPrice().multiply(disPrice).setScale(2,BigDecimal.ROUND_HALF_UP);
        }else {
            disAmount = discountRecord.getDisValue();
        }
        return disAmount;
    }

    /**
     * 业务、优惠支付生成预支付订单参数处理
     * @return
     */
    public static LocalDate getEndDate(String disName) {
        LocalDate endDate;
        switch (disName){
            case "月度VIP":
                endDate = LocalDate.now().plusMonths(1);break;
            case "季度VIP":
                endDate = LocalDate.now().plusMonths(3);break;
            case "半年VIP":
                endDate = LocalDate.now().plusMonths(6);break;
            case "年度VIP":
                endDate = LocalDate.now().plusYears(1);break;
            default:
                return null;
        }
        return endDate;
    }

    /**
     * 判断是否为弹框
     * @param type
     * @return
     */
    public static Boolean contrast(String type){
        String[] strArr = {"弹框","立减弹框","满减弹框","折扣弹框","万能弹框"};
        boolean res = Arrays.asList(strArr).contains(type);
        return res;
    }

}
