using System.ComponentModel.DataAnnotations;
using ERPCore.Domain.Enums;

namespace ERPCore.Dtos.Customers;

/// <summary>Customer resource used by sales documents.</summary>
public sealed record CustomerDto(
    int CustomerId,
    string CustomerCode,
    CustomerType CustomerType,
    string Name,
    string? DisplayName,
    string? Phone,
    string? Email,
    string? AddressLine1,
    string? AddressLine2,
    string? City,
    string? Country,
    string? TaxRegistrationNo,
    decimal CreditLimit,
    int CreditDays,
    int? DefaultWarehouseId,
    EntityStatus Status,
    DateTime CreatedAt,
    DateTime? UpdatedAt);

public sealed class CreateCustomerRequest
{
    [Required, StringLength(50)] public string CustomerCode { get; set; } = string.Empty;
    [Required, EnumDataType(typeof(CustomerType))] public CustomerType CustomerType { get; set; } = CustomerType.B2C;
    [Required, StringLength(200)] public string Name { get; set; } = string.Empty;
    [StringLength(200)] public string? DisplayName { get; set; }
    [StringLength(30)] public string? Phone { get; set; }
    [StringLength(100)] public string? Email { get; set; }
    [StringLength(250)] public string? AddressLine1 { get; set; }
    [StringLength(250)] public string? AddressLine2 { get; set; }
    [StringLength(100)] public string? City { get; set; }
    [StringLength(100)] public string? Country { get; set; }
    [StringLength(50)] public string? TaxRegistrationNo { get; set; }
    [Range(0, double.MaxValue)] public decimal CreditLimit { get; set; }
    [Range(0, int.MaxValue)] public int CreditDays { get; set; }
    public int? DefaultWarehouseId { get; set; }
}

public sealed class UpdateCustomerRequest
{
    [Required, StringLength(50)] public string CustomerCode { get; set; } = string.Empty;
    [Required, EnumDataType(typeof(CustomerType))] public CustomerType CustomerType { get; set; } = CustomerType.B2C;
    [Required, StringLength(200)] public string Name { get; set; } = string.Empty;
    [StringLength(200)] public string? DisplayName { get; set; }
    [StringLength(30)] public string? Phone { get; set; }
    [StringLength(100)] public string? Email { get; set; }
    [StringLength(250)] public string? AddressLine1 { get; set; }
    [StringLength(250)] public string? AddressLine2 { get; set; }
    [StringLength(100)] public string? City { get; set; }
    [StringLength(100)] public string? Country { get; set; }
    [StringLength(50)] public string? TaxRegistrationNo { get; set; }
    [Range(0, double.MaxValue)] public decimal CreditLimit { get; set; }
    [Range(0, int.MaxValue)] public int CreditDays { get; set; }
    public int? DefaultWarehouseId { get; set; }
}

public sealed class UpdateCustomerStatusRequest
{
    [Required, EnumDataType(typeof(EntityStatus))] public EntityStatus Status { get; set; }
}
