package com.zioinfo.kintex.mail;

import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.ArrayList;
import java.util.List;

/**
 * 메일 발송 채널 설정 — 자체 Postfix SMTP(mail.zioinfo.co.kr, GUARDiA 운영).
 *
 * <p>SMTP 자격증명(host/user/password)은 {@code spring.mail.*}(env: SMTP_HOST·SMTP_USER·SMTP_PASSWORD)로만 주입한다.
 * 여기서는 발송 on/off({@code enabled})와 발신자 표기({@code from})만 다룬다. 자격증명은 코드·응답·로그에 기재 금지(§0-3).
 *
 * <ul>
 *   <li>{@code MAIL_ENABLED}(기본 false) — 실 발송 스위치. false면 인앱/로깅만 하고 실제 전송은 건너뛴다(정직 로그).</li>
 *   <li>{@code MAIL_FROM} — From 헤더 표기 주소.</li>
 * </ul>
 *
 * <p><b>EDM 발송 안전장치({@code edm-*})</b>: 대량 마케팅 발송의 오발송·과발송을 막는다.
 * <ul>
 *   <li>{@code edm-test-mode}(기본 true) — 테스트 모드. 실제 수신자에게 보내지 않고 지정 테스트 수신함으로만 보내거나
 *       dry-run 집계만 수행한다. 운영 발송은 발송 요청에 명시 플래그(live=true)가 있어야 한다.</li>
 *   <li>{@code edm-test-recipients} — 테스트 모드 발송 대상(콤마 구분). 비어 있으면 dry-run 카운트만.</li>
 *   <li>{@code edm-campaign-cap} — 캠페인 1회당 발송 상한(하드 실링).</li>
 *   <li>{@code edm-rate-per-minute} — 1회 발송 호출(≈분당)에서 실제 디스패치할 최대 건수. 초과분은 rate_capped 스킵.</li>
 * </ul>
 */
@ConfigurationProperties(prefix = "kintex.mail")
public class MailProperties {

    /** 실 발송 여부(기본 false — env로 켠다). false면 실제 SMTP 전송 없이 스킵 로그만 남긴다. */
    private boolean enabled = false;

    /** 발신자 주소(From). */
    private String from = "no-reply@kintex.zioinfo.co.kr";

    /** 프론트 베이스 URL — 메일 내 링크(옥션 상세·재설정 화면·수신거부) 생성용. */
    private String webBaseUrl = "https://kintex.zioinfo.co.kr";

    /** EDM 테스트 모드(기본 true) — 실 수신자 미발송. 운영 발송은 요청 live=true 명시 필요. */
    private boolean edmTestMode = true;

    /** 테스트 모드 발송 대상(콤마 구분, env EDM_TEST_RECIPIENTS). 비면 dry-run 카운트만. */
    private List<String> edmTestRecipients = new ArrayList<>();

    /** 캠페인 1회당 발송 상한(하드 실링). */
    private int edmCampaignCap = 5000;

    /** 1회 발송 호출에서 실제 디스패치할 최대 건수(분당 rate cap). 초과분은 스킵. */
    private int edmRatePerMinute = 300;

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public String getWebBaseUrl() {
        return webBaseUrl;
    }

    public void setWebBaseUrl(String webBaseUrl) {
        this.webBaseUrl = webBaseUrl;
    }

    public boolean isEdmTestMode() {
        return edmTestMode;
    }

    public void setEdmTestMode(boolean edmTestMode) {
        this.edmTestMode = edmTestMode;
    }

    public List<String> getEdmTestRecipients() {
        return edmTestRecipients;
    }

    public void setEdmTestRecipients(List<String> edmTestRecipients) {
        this.edmTestRecipients = edmTestRecipients == null ? new ArrayList<>() : edmTestRecipients;
    }

    public int getEdmCampaignCap() {
        return edmCampaignCap;
    }

    public void setEdmCampaignCap(int edmCampaignCap) {
        this.edmCampaignCap = edmCampaignCap;
    }

    public int getEdmRatePerMinute() {
        return edmRatePerMinute;
    }

    public void setEdmRatePerMinute(int edmRatePerMinute) {
        this.edmRatePerMinute = edmRatePerMinute;
    }
}
