namespace TaxBaik.WasmClient.Components.Admin.Forms;

using System.ComponentModel.DataAnnotations;
using TaxBaik.Application.DTOs;

public sealed class CompanyFormModel
{
    [Required(ErrorMessage = "회사 코드를 입력하세요.")]
    [StringLength(50, ErrorMessage = "회사 코드는 최대 50자까지 입력 가능합니다.")]
    public string CompanyCode { get; set; } = "";

    [Required(ErrorMessage = "회사명을 입력하세요.")]
    [StringLength(100, ErrorMessage = "회사명은 최대 100자까지 입력 가능합니다.")]
    public string CompanyName { get; set; } = "";

    [StringLength(100, ErrorMessage = "담당자명은 최대 100자까지 입력 가능합니다.")]
    public string? ContactPerson { get; set; }

    [StringLength(20, ErrorMessage = "전화번호는 최대 20자까지 입력 가능합니다.")]
    public string? Phone { get; set; }

    [EmailAddress(ErrorMessage = "올바른 이메일 형식이 아닙니다.")]
    public string? Email { get; set; }

    [StringLength(1000, ErrorMessage = "메모는 최대 1000자까지 입력 가능합니다.")]
    public string? Memo { get; set; }

    public bool IsActive { get; set; } = true;
}

public sealed class InquiryFormModel
{
    [Required(ErrorMessage = "이름을 입력하세요.")]
    [StringLength(ValidationRules.NameMaxLength, ErrorMessage = "이름은 최대 100자까지 입력 가능합니다.")]
    public string Name { get; set; } = "";

    [Required(ErrorMessage = "전화번호를 입력하세요.")]
    [RegularExpression(
        ValidationRules.KoreanPhonePattern,
        ErrorMessage = "올바른 전화번호 형식이 아닙니다.")]
    public string Phone { get; set; } = "";

    [EmailAddress(ErrorMessage = "올바른 이메일 형식이 아닙니다.")]
    public string? Email { get; set; }

    [StringLength(ValidationRules.ServiceTypeMaxLength, ErrorMessage = "상담분야는 최대 50자까지 입력 가능합니다.")]
    public string ServiceType { get; set; } = "기타";

    [Required(ErrorMessage = "문의 내용을 입력하세요.")]
    [StringLength(ValidationRules.MessageMaxLength, MinimumLength = ValidationRules.MessageMinLength, ErrorMessage = "문의 내용은 최소 10자, 최대 5000자까지 입력 가능합니다.")]
    public string Message { get; set; } = "";

    [Required(ErrorMessage = "상태를 선택하세요.")]
    public string Status { get; set; } = "new";

    [StringLength(ValidationRules.MemoMaxLength, ErrorMessage = "관리 메모는 최대 1000자까지 입력 가능합니다.")]
    public string? AdminMemo { get; set; }
}

public sealed class BlogFormModel
{
    [Required(ErrorMessage = "제목을 입력하세요.")]
    [StringLength(ValidationRules.TitleMaxLength, ErrorMessage = "제목은 최대 100자까지 입력 가능합니다.")]
    public string Title { get; set; } = "";

    [Required(ErrorMessage = "본문 내용을 입력하세요.")]
    [StringLength(ValidationRules.ContentMaxLength, MinimumLength = ValidationRules.MessageMinLength, ErrorMessage = "본문은 최소 10자 이상이어야 합니다.")]
    public string Content { get; set; } = "";

    public int? CategoryId { get; set; }

    [StringLength(ValidationRules.TagsMaxLength, ErrorMessage = "태그는 최대 500자까지 입력 가능합니다.")]
    public string? Tags { get; set; }

    [StringLength(ValidationRules.SeoTitleMaxLength, ErrorMessage = "SEO 제목은 최대 120자까지 입력 가능합니다.")]
    public string? SeoTitle { get; set; }

    [StringLength(ValidationRules.SeoDescriptionMaxLength, ErrorMessage = "SEO 설명은 최대 300자까지 입력 가능합니다.")]
    public string? SeoDescription { get; set; }

    public bool IsPublished { get; set; }
}

public sealed class FaqFormModel
{
    [Required(ErrorMessage = "질문을 입력하세요.")]
    [StringLength(ValidationRules.QuestionMaxLength, ErrorMessage = "질문은 최대 300자까지 입력 가능합니다.")]
    public string Question { get; set; } = "";

    [Required(ErrorMessage = "답변을 입력하세요.")]
    [StringLength(ValidationRules.MessageMaxLength, MinimumLength = ValidationRules.MessageMinLength, ErrorMessage = "답변은 최소 10자, 최대 5000자까지 입력 가능합니다.")]
    public string Answer { get; set; } = "";

    [StringLength(ValidationRules.ServiceTypeMaxLength, ErrorMessage = "카테고리는 최대 50자까지 입력 가능합니다.")]
    public string? Category { get; set; }

    [Range(0, 9999, ErrorMessage = "정렬 순서는 0 이상 9999 이하이어야 합니다.")]
    public int SortOrder { get; set; }

    public bool IsActive { get; set; }
}

public sealed class ClientFormModel
{
    [Required(ErrorMessage = "고객명을 입력하세요.")]
    [StringLength(ValidationRules.NameMaxLength, ErrorMessage = "고객명은 최대 100자까지 입력 가능합니다.")]
    public string Name { get; set; } = "";

    [StringLength(ValidationRules.NameMaxLength, ErrorMessage = "회사명은 최대 100자까지 입력 가능합니다.")]
    public string? CompanyName { get; set; }

    [StringLength(ValidationRules.PhoneMaxLength, ErrorMessage = "전화번호는 최대 20자까지 입력 가능합니다.")]
    public string? Phone { get; set; }

    [EmailAddress(ErrorMessage = "올바른 이메일 형식이 아닙니다.")]
    public string? Email { get; set; }

    [StringLength(ValidationRules.ServiceTypeMaxLength, ErrorMessage = "서비스 유형은 최대 50자까지 입력 가능합니다.")]
    public string? ServiceType { get; set; }

    [StringLength(ValidationRules.ServiceTypeMaxLength, ErrorMessage = "세금 유형은 최대 50자까지 입력 가능합니다.")]
    public string? TaxType { get; set; }

    [Required(ErrorMessage = "상태를 선택하세요.")]
    public string Status { get; set; } = "active";

    [StringLength(ValidationRules.ServiceTypeMaxLength, ErrorMessage = "유입 경로는 최대 50자까지 입력 가능합니다.")]
    public string? Source { get; set; }

    [StringLength(ValidationRules.MemoMaxLength, ErrorMessage = "메모는 최대 1000자까지 입력 가능합니다.")]
    public string? Memo { get; set; }
}

public sealed class ContractFormModel
{
    [Required(ErrorMessage = "고객을 선택하세요.")]
    public int? ClientId { get; set; }

    [Required(ErrorMessage = "계약번호를 입력하세요.")]
    [StringLength(ValidationRules.ContractNumberMaxLength, ErrorMessage = "계약번호는 최대 50자까지 입력 가능합니다.")]
    public string ContractNumber { get; set; } = "";

    [Required(ErrorMessage = "서비스 유형을 선택하세요.")]
    [StringLength(ValidationRules.ServiceTypeMaxLength, ErrorMessage = "서비스 유형은 최대 50자까지 입력 가능합니다.")]
    public string ServiceType { get; set; } = "";

    [Required(ErrorMessage = "계약 시작일을 입력하세요.")]
    public DateTime? StartDate { get; set; }

    [Range(0, 999999999, ErrorMessage = "월 수수료는 0 이상이어야 합니다.")]
    public decimal? MonthlyFee { get; set; }
}

public sealed class TaxFilingScheduleFormModel
{
    [Required(ErrorMessage = "고객을 선택하세요.")]
    public int? ClientId { get; set; }

    [Required(ErrorMessage = "신고 유형을 선택하세요.")]
    [StringLength(ValidationRules.ServiceTypeMaxLength, ErrorMessage = "신고 유형은 최대 50자까지 입력 가능합니다.")]
    public string FilingType { get; set; } = "";

    [Required(ErrorMessage = "마감일을 입력하세요.")]
    public DateTime? DueDate { get; set; }

    [Range(2000, 2100, ErrorMessage = "신고연도는 2000년부터 2100년 사이여야 합니다.")]
    public int FilingYear { get; set; } = DateTime.Now.Year;
}

public sealed class TaxProfileFormModel
{
    [Required(ErrorMessage = "고객을 선택하세요.")]
    public int? ClientId { get; set; }

    [Required(ErrorMessage = "사업 유형을 선택하세요.")]
    [StringLength(ValidationRules.ServiceTypeMaxLength, ErrorMessage = "사업 유형은 최대 50자까지 입력 가능합니다.")]
    public string BusinessType { get; set; } = "";

    [Required(ErrorMessage = "위험도를 선택하세요.")]
    [StringLength(ValidationRules.RiskLevelMaxLength, ErrorMessage = "위험도는 최대 20자까지 입력 가능합니다.")]
    public string TaxRiskLevel { get; set; } = "normal";

    public DateTime? NextFilingDueDate { get; set; }

    [StringLength(ValidationRules.MemoMaxLength, ErrorMessage = "특수 사항은 최대 1000자까지 입력 가능합니다.")]
    public string? SpecialNotes { get; set; }
}

public sealed class SiteSettingsFormModel
{
    [Required(ErrorMessage = "전화번호를 입력하세요.")]
    [StringLength(ValidationRules.PhoneMaxLength, ErrorMessage = "전화번호는 최대 20자까지 입력 가능합니다.")]
    public string Phone { get; set; } = "";

    [Required(ErrorMessage = "이메일을 입력하세요.")]
    [EmailAddress(ErrorMessage = "올바른 이메일 형식이 아닙니다.")]
    public string Email { get; set; } = "";

    [Url(ErrorMessage = "올바른 카카오채널 URL 형식이 아닙니다.")]
    public string? KakaoUrl { get; set; }

    [Url(ErrorMessage = "올바른 인스타그램 URL 형식이 아닙니다.")]
    public string? InstagramUrl { get; set; }
}

public sealed class PasswordChangeFormModel
{
    [Required(ErrorMessage = "현재 비밀번호를 입력하세요.")]
    public string CurrentPassword { get; set; } = "";

    [Required(ErrorMessage = "새 비밀번호를 입력하세요.")]
    [StringLength(128, MinimumLength = 12, ErrorMessage = "새 비밀번호는 최소 12자 이상이어야 합니다.")]
    public string NewPassword { get; set; } = "";

    [Required(ErrorMessage = "새 비밀번호 확인을 입력하세요.")]
    [Compare(nameof(NewPassword), ErrorMessage = "새 비밀번호와 확인이 일치하지 않습니다.")]
    public string ConfirmNewPassword { get; set; } = "";
}
