
package dev.sonpx.loyalty.mcp.reward.model;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import dev.sonpx.loyalty.mcp.enums.ExpiryPolicy;
import dev.sonpx.loyalty.mcp.reward.enums.BaseDateType;
import dev.sonpx.loyalty.mcp.reward.enums.NotificationChannel;
import dev.sonpx.loyalty.mcp.reward.enums.RuleType;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import lombok.Getter;
import lombok.Setter;

/**
 * Created by SonPhung on Monday, 13-Mon-2023
 */
@Getter
@Setter
public class CampaignRule extends Fw {

    /**
     * General Rule Infomation
     */
    @NotNull
    @JsonPropertyDescription("Tham chiếu đến Campaign chứa rule này")
    private ReferenceData campaignId;

    @NotBlank
    @Size(min = 1, max = 10)
    @JsonPropertyDescription("Mã định danh của rule (tối đa 10 ký tự)")
    private String ruleId;

    @NotBlank
    @Size(min = 1, max = 100)
    @JsonPropertyDescription("Tên của rule")
    private String ruleName;

    @JsonPropertyDescription("Loại rule: RED (Đổi điểm), REP (Đổi quà), AWD (Thưởng), ADJ (Điều chỉnh), MAWD (Thưởng Marketing), CEP (Sự kiện)")
    private RuleType ruleType;

    @Size(max = 500)
    @JsonPropertyDescription("Mô tả chi tiết về rule")
    private String description;

    @JsonPropertyDescription("Thời gian bắt đầu có hiệu lực của rule")
    private LocalDateTime effectiveFrom;

    @JsonPropertyDescription("Thời gian kết thúc hiệu lực của rule")
    private LocalDateTime effectiveTo;

    @JsonPropertyDescription("Loại ngày làm cơ sở để tính toán hiệu lực (nếu có)")
    private BaseDateType effectivePeriodIsBase;

    @JsonPropertyDescription("Mẫu tin nhắn áp dụng cho rule này")
    private ReferenceData messageTemplateId;

    @JsonPropertyDescription("Có dừng xử lý các rule tiếp theo nếu criteria của rule này thỏa mãn không?")
    private Boolean stopIfCriteriaMet;

    @JsonPropertyDescription("Không cập nhật số dư Pool?")
    private Boolean notUpdatePool;

    @Valid
    @JsonPropertyDescription("Danh sách liên kết Transaction Code")
    private List<CampaignTcLinkage> campaignTcLinkages;

    /**
     * Rule Criteria
     */
    @Valid
    @JsonPropertyDescription("Điều kiện cấu hình chi tiết cho rule")
    private CampaignCriteria campaignCriteria;

    /**
     * Reward Setting - AWD/RED
     */
    @JsonPropertyDescription("Tham chiếu đến Pool chính")
    private ReferenceData poolId;

    @JsonPropertyDescription("Tham chiếu đến Sub-Pool")
    private ReferenceData subPoolId;

    @JsonPropertyDescription("Chính sách hết hạn của điểm/quà")
    private ExpiryPolicy expiryPolicy;

    @JsonFormat(shape = JsonFormat.Shape.STRING)
    @JsonPropertyDescription("Tham số cho chính sách hết hạn (ví dụ: số tháng)")
    private Integer expiryPolicyParam;

    @JsonPropertyDescription("Ngày hết hạn cố định (nếu có)")
    private LocalDate fixedDate;

    @JsonFormat(shape = JsonFormat.Shape.STRING)
    @JsonPropertyDescription("Ngày trong tháng (dùng cho chính sách hết hạn)")
    private Integer dayOfMonth;

    @JsonFormat(shape = JsonFormat.Shape.STRING)
    @JsonPropertyDescription("Tháng trong năm (dùng cho chính sách hết hạn)")
    private Integer monthOfYear;

    @JsonPropertyDescription("Mã sản phẩm/quà tặng")
    private ReferenceData itemCode;

    @JsonPropertyDescription("Chỉ áp dụng tiêu chí đầu tiên thỏa mãn trong Formula 10")
    private Boolean attrApplyFirstFlag;

    @JsonPropertyDescription("Chỉ áp dụng tiêu chí đầu tiên thỏa mãn trong Formula 11")
    private Boolean segApplyFirstFlag;

    @Valid
    @JsonPropertyDescription("Cấu hình công thức tính toán chung")
    private CampaignFormulaSetting campaignFormulaSetting;

    @Valid
    @JsonPropertyDescription("Danh sách giới hạn phần thưởng")
    private List<CampaignAwardLimit> campaignAwardLimits;

    @Valid
    @JsonPropertyDescription("Cấu hình Formula 1")
    private CampaignFormulaOne campaignFormulaOne;

    @Valid
    @JsonPropertyDescription("Cấu hình Formula 2, Thưởng điểm theo giá trị cố định")
    private CampaignFormulaTwo campaignFormulaTwo;

    @Valid
    @JsonPropertyDescription("Cấu hình Formula 4")
    private CampaignFormulaFour campaignFormulaFour;

    @Valid
    @JsonPropertyDescription("Danh sách cấu hình Formula 5")
    private List<CampaignFormulaFive> campaignFormulaFives;

    @Valid
    @JsonPropertyDescription("Cấu hình Formula 6")
    private CampaignFormulaSix campaignFormulaSix;

    @Valid
    @JsonPropertyDescription("Danh sách cấu hình Formula 8")
    private List<CampaignFormulaEight> campaignFormulaEights;

    @Valid
    @JsonPropertyDescription("Danh sách cấu hình Formula 10")
    private List<CampaignFormulaTen> campaignFormulaTens;

    @Valid
    @JsonPropertyDescription("Danh sách cấu hình Formula 11")
    private List<CampaignFormulaEleven> campaignFormulaElevens;

    @Valid
    @JsonPropertyDescription("Danh sách các Contributor cho Campaign")
    private List<CampaignContributor> campaignContributors;

    @JsonPropertyDescription("Thứ tự ưu tiên áp dụng các Formula")
    private List<String> formulaSequence;

    /**
     * Redemption Extract Rule Type
     */
    @JsonPropertyDescription("Cấu hình cho loại rule Redemption Extract")
    private RedemptionExtractRequest redemptionExtract;

    /**
     * Counter Extract Rule Type
     */
    @Valid
    @JsonPropertyDescription("Cấu hình cho loại rule Counter Extract")
    private CounterExtractRequest counterExtractRequest;

    /**
     * Marketing Reward Rule Type
     */
    @Valid
    @JsonPropertyDescription("Cấu hình cho loại rule Marketing Reward")
    private MarketingRewardRequest marketingRewardRequest;

    @Valid
    @JsonPropertyDescription("Cấu hình lịch trình chạy cho rule")
    private CampaignRuleSchedule campaignRuleSchedule;

    /**
     * Notification Info
     */
    @JsonPropertyDescription("Kênh gửi thông báo (ví dụ: SMS, EMAIL, NOTIFICATION)")
    private NotificationChannel channel;

    @Valid
    @JsonPropertyDescription("Nội dung thông báo qua SMS")
    private RewardContentSms rewardContentSms;

    @Valid
    @JsonPropertyDescription("Nội dung thông báo qua Email")
    private RewardContentEmail rewardContentEmail;

    @Valid
    @JsonPropertyDescription("Nội dung thông báo In-App Notification")
    private RewardContentNotification rewardContentNotification;

}
