using System.ComponentModel.DataAnnotations;
namespace ROLAC.API.DTOs.Settings;

// ── Site settings ──────────────────────────────────────────────────────────

public class SiteSettingDto
{
    public string  SiteTitle       { get; set; } = "";
    public string? SiteTitleZh     { get; set; }
    public string  DefaultLanguage { get; set; } = "en";
    public string  TimeZone        { get; set; } = "";
    public string  DateFormat      { get; set; } = "";
    public string  Currency        { get; set; } = "";
}

public class UpdateSiteSettingRequest
{
    [Required, MaxLength(200)] public string  SiteTitle       { get; set; } = "";
    [MaxLength(200)]           public string? SiteTitleZh     { get; set; }
    [Required, MaxLength(10)]  public string  DefaultLanguage { get; set; } = "en";
    [Required, MaxLength(100)] public string  TimeZone        { get; set; } = "";
    [Required, MaxLength(50)]  public string  DateFormat      { get; set; } = "";
    [Required, MaxLength(10)]  public string  Currency        { get; set; } = "";
}

// ── Notification settings ──────────────────────────────────────────────────
// Secrets are never returned. The DTO exposes only whether each secret is configured; the UI
// shows a write-only field where a blank value on update means "keep the stored secret".

public class NotificationSettingDto
{
    public bool   EnableEmail { get; set; }
    public string SmtpHost    { get; set; } = "";
    public int    SmtpPort    { get; set; }
    public bool   SmtpUseSsl  { get; set; }
    public string SmtpUser    { get; set; } = "";
    public string FromAddress { get; set; } = "";
    public string FromName    { get; set; } = "";
    public bool   HasSmtpPassword { get; set; }

    public bool   EnableLine { get; set; }
    public bool   HasLineChannelAccessToken { get; set; }
    public bool   HasLineChannelSecret      { get; set; }

    /// <summary>Read-only webhook URL to register in the Line console (derived from the request).</summary>
    public string WebhookUrl { get; set; } = "";
}

public class UpdateNotificationSettingRequest
{
    public bool   EnableEmail { get; set; }
    [MaxLength(200)] public string  SmtpHost    { get; set; } = "";
    [Range(0, 65535)] public int    SmtpPort    { get; set; } = 587;
    public bool   SmtpUseSsl  { get; set; } = true;
    [MaxLength(200)] public string  SmtpUser    { get; set; } = "";
    [MaxLength(200)] public string? FromAddress { get; set; }
    [MaxLength(200)] public string? FromName    { get; set; }
    /// <summary>Blank = keep the stored password unchanged.</summary>
    [MaxLength(500)] public string? SmtpPassword { get; set; }

    public bool   EnableLine { get; set; }
    /// <summary>Blank = keep the stored token unchanged.</summary>
    [MaxLength(500)] public string? LineChannelAccessToken { get; set; }
    /// <summary>Blank = keep the stored secret unchanged.</summary>
    [MaxLength(200)] public string? LineChannelSecret { get; set; }
}

// ── Test-send requests ─────────────────────────────────────────────────────

public class TestEmailRequest
{
    /// <summary>Optional override; defaults to the current user's email when omitted.</summary>
    [MaxLength(200), EmailAddress] public string? ToAddress { get; set; }
}

public class TestLineRequest
{
    public int? MemberId { get; set; }
    public int? GroupId  { get; set; }
}
