package cn.freemud.entities.dto;

import cn.freemud.entities.dto.shoppingCart.SendPoint;
import cn.freemud.entities.vo.SubtractStockVO;
import com.freemud.application.sdk.api.promotioncenter.dto.promotion.DiscountDTO;
import com.freemud.application.sdk.api.promotioncenter.dto.promotion.SendCouponsDTO;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Data
public class ActivityCalculationDiscountResponseDto {

    private Integer ver;

    /**
     * 状态码
     */
    private String statusCode;

    /**
     * 状态码描述
     */
    private String msg;

    /**
     * 优惠后运费
     */
    private Long distributionFee;

    /**
     * 集合外的为系统按照优先级计算出来的优惠信息
     * ，calculationResults集合中的为多种优惠方案
     * 计算出来的优惠信息列表，并按优惠力度倒序排列
     */
    private CalculationDiscountResult result;

    @Data
    public static class CalculationDiscountResult {
        /**
         * 原总价（分）
         */
        private Long originalTotalAmount;
        /**
         * 需支付金额（分）
         */
        private Long totalAmount;
        /**
         * 总优惠金额（分）
         */
        private Long totalDiscountAmount;
        /**
         * 总的优惠信息集合
         */
        private List<Discount> discounts;
        /**
         * 商品优惠信息
         */
        private List<Goods> goods;
        /**
         * 赠送、换购商品信息集合
         */
        private List<SendActivity> sendGoods;
        /**
         * 满额赠券活动号列表
         */
        private List<String> sendCoupons;
        /**
         * 使用到的优惠券及优惠金额
         */
        private List<CouponResults> couponDiscounts;


        /**
         * 多种优惠方案计算出的优惠集合，并按优惠力度倒序排列
         */
//        private List<CalculationResult> calculationResults;

        List<ApportionGoods> apportionGoods;
        /**
         * 促销活动
         */
        List<ActivityPrompt> activityPrompts;

        /**
         * 校验后有效的商品券map
         */
        private Map<String, CheckSpqInfoResponseDto> validCouponMap;
        /**
         * 扣减库存
         */
        private List<SubtractStockVO> stocks;

        /**
         * 配送费
         */
        private Long deliveryAmount;

        /**
         * 优惠后 配送费
         */
        private Long distributionFee;
        /**
         * 麦咖啡，月卡金额
         */
        private Long payCardFee;

        private SendPoint sendPointVo;


        @Data
        public static class ActivityPrompt {

            private String acitivityName;
            private String activityCode;
            private Integer activityType;
            private Long discountAmout;
            private Long thresholdAmount;
            private Long totalAmount;
            private Long alreadyDiscountAmount;
        }

        @Data
        public static class Discount {
            /**
             * 活动号
             */
            private String activityCode;
            /**
             * 活动名称
             */
            private String activityName;
            /**
             * 活动描述
             */
            private String activityDesc;
            /**
             * 每个活动优惠总金额（单位分）
             */
            private Integer discount;
            /**
             * 优惠类型：
             * 1-整单满减
             * 11-每满减
             * 12-阶梯满减
             * 2-单品特价
             * 14-满额减配送费
             * 21-单品折扣
             * 3-优惠券
             * 5-整单满金额折
             * 51-每满金额折
             * 52-阶梯满金额折
             * 53-第M件/杯N折
             * 6-买M赠N
             * 7-满额赠券
             * 8-满N件换购
             * 81-满额换购
             * 82-阶梯满数量打折
             * 83-整单满数量打折
             */
            private Integer type;

            private Long thresholdAmount;
            /**
             * 运费月卡入机字段
             */
            private String tenderId;
            /**
             *  1-运费券 2-运费月卡券 3-月卡券 4-万能券 5-啡常月享卡 6-通用券 7买三赠一券
             */
            private Integer extendType;

            private SendPointDto sendPointVo;

            private Date endTime;

            /**
             * 买卡现价
             */
            private Integer cardAmount;
            /**
             * 买卡原价
             */
            private Integer cardOriginalPrice;
        }

        @Data
        public static class SendPointDto{
            private String activityCode;
            private Integer sendPoint;
            private Integer maxNum;
            private Integer exchangeNum;
            private Integer validityDateDays;
        }

        @Data
        public static class Goods {

            /**
             * 购物车行记录
             */
            private String cartGoodsUid;
            /**
             * 商品id
             */
            private String goodsId;
            /**
             * 商品数量
             */
            private Integer goodsQuantity;
            /**
             * 商品原价（分）
             */
            private Long originalPrice;
            /**
             * 商品现价（分）
             */
            private Long nowPrice;
            /**
             * 分摊到商品上的优惠总金额
             */
            private Long discountAmount;
            /**
             * 商品实付金额
             */
            private Long realAmount;
            /**
             * 实际优惠的商品数量
             */
            private Integer actualGoodsNumber;
            private List<GoodsDiscount> discounts;

            /**
             * 活动键位编号
             */
            private String artNo;

            /**
             * 小料节点
             */
            private List<GoodsMaterial> smallMaterial;

            @Data
            public static class GoodsDiscount {
                /**
                 * 活动号
                 */
                private String activityCode;
                /**
                 * 活动名称
                 */
                private String activityName;
                /**
                 * 活动描述
                 */
                private String activityDesc;

                /**
                 * 商品ID
                 */
                private String goodsId;
                /**
                 * 折扣金额
                 */
                private Long discount;

                /**
                 * 活动类型
                 */
                private Integer type;
                /**
                 * 当前活动实际优惠的商品数量
                 */
                private Integer actualGoodsNumber;
            }

            @Data
            public static class GoodsMaterial{
                /**
                 * 子商品类型：1-小料；2-可选商品
                 */
                private Integer type;
                /**
                 * 小料商品ID
                 */
                private String goodsId;
                /**
                 * 小料数量
                 */
                private Integer goodsQuantity;
                /**
                 * 商品原价(单位：分)
                 */
                private Integer originalPrice;
                /**
                 * 商品现价(单位：分)
                 */
                private Integer nowPrice;
                /**
                 * 分摊到商品上的优惠总金额
                 */
                private Integer discountAmount;
                /**
                 * 商品实付金额
                 */
                private Integer realAmount;
            }
        }

        @Data
        public static class SendActivity {
            /**
             * 活动号
             */
            private String activityCode;
            /**
             * 活动名称
             */
            private String activityName;
            /**
             * 活动类型
             */
            private Integer activityType;
            /**
             * 可选赠送商品最大数量
             */
            private Integer maxNum;
            /**
             * 可选赠送商品最小数量
             */
            private Integer minNum;
            /**
             * 买M送N时，送ABC中选其中几个
             */
            private Integer sendKinds;
            private List<SendGoods> sendGoods;

            @Data
            public static class SendGoods {
                /**
                 * 赠送商品ID
                 */
                private String goodsId;
                /**
                 * 品类
                 */
                private String category;
                /**
                 * 赠送商品名称
                 */
                private String goodsName;
                /**
                 * 赠送商品现价（单位：分）（加价换购时表示需要加的价格）
                 */
                private Long nowPrice;
                /**
                 * 赠送商品原价
                 */
                private Long originalPrice;
                /**
                 * 赠送商品数量
                 */
                private Integer sendNumber;
            }
        }

        @Data
        public static class CouponResults {
            /**
             * 优惠券号
             */
            private String couponCode;
            /**
             * 优惠金额（单位分）
             */
            private Integer discountAmount;

            private Integer activityType;

            private String activityName;
        }

        @Data
        public static class CalculationResult {
            /**
             * 原总价（分）
             */
            private Integer originalTotalAmount;
            /**
             * 需支付金额（分）
             */
            private Integer totalAmount;
            /**
             * 总优惠金额（分）
             */
            private Integer totalDiscountAmount;
            /**
             * 总的优惠信息集合
             */
            private List<Discount> discounts;

            /**
             * 商品优惠信息
             */
            private List<Goods> goods;

            /**
             * 赠送、换购商品信息集合
             */
            private List<SendActivity> sendGoods;
        }

        @Data
        public static class ApportionGoods {

            /**
             * 商品id
             */
            private String goodsId;
            /**
             * 商品数量
             */
            private Integer goodsQuantity;
            /**
             * 商品原价（分）
             */
            private Long originalPrice;
            /**
             * 赠送商品现价（单位：分）（加价换购时表示需要加的价格）
             */
            private Long nowPrice;
            /**
             * 均摊金额
             */
            private Integer apportionAmount;

            private List<ApportionDetails> apportionDetails;
            private List<Material> smallMaterial;
            /**
             * 购物车行记录
             */
            private String cartGoodsUid;

            @Data
            public static class ApportionDetails {
                /**
                 * 活动code,如果是商品券，优惠券，放券code
                 */
                private String activityCode;
                /**
                 * 活动类型  ActivityTypeEnum 枚举，不能为空
                 */
                private Integer activityType;
                /**
                 * 活动名称，如果是商品券，优惠券，放券名称
                 */
                private String activityName;
                /**
                 * 特价价格 比如限时特价价格
                 */
                private Long goodsNowPrice;
                /**
                 * 折扣比率 百分比，非必传  有折扣活动
                 */
                private Long activityRebate;
                /**
                 * 促销类型  交易类促销  商品类促销  ApportionType
                 */
                private Integer apportionType;
                /**
                 * 活动均摊金额
                 */
                private Long activityApportionAmount;
            }

            @Data
            @NoArgsConstructor
            public static class Material {
                /**
                 * 均摊金额
                 */
                private Integer apportionAmount;
                /**
                 * 购物车行记录
                 */
                private String cartGoodsUid;

                /**
                 * 商品id
                 */
                private String goodsId;

                /**
                 * 商品数量
                 */
                private Integer goodsQuantity;

                /**
                 * 赠送商品现价（单位：分）（加价换购时表示需要加的价格）
                 */
                private Long nowPrice;

                /**
                 * 商品原价（分）
                 */
                private Long originalPrice;
                private List<ApportionDetails> apportionDetails;

            }
        }
    }


}
