use crate::impl_nutype_error_conversion;
use nutype::nutype;

/// Nome do cliente (máximo 100 caracteres)
///
/// # Validações
/// - Não pode ser vazio (após trim)
/// - Máximo 100 caracteres
/// - Whitespace é removido automaticamente (trim)
///
/// # Exemplos
/// ```
///   use konduto::customer_name::CustomerName;
///
/// let name = CustomerName::try_new("João Silva").unwrap();
/// assert_eq!(name.as_str(), "João Silva");
///
/// // String vazia é rejeitada
/// assert!(CustomerName::try_new("").is_err());
///
/// // String muito longa é rejeitada
/// assert!(CustomerName::try_new("a".repeat(101)).is_err());
/// ```
#[nutype(
    sanitize(trim),
    validate(not_empty, len_char_max = 100),
    derive(
        Debug,
        Clone,
        PartialEq,
        Eq,
        Display,
        AsRef,
        Deref,
        Serialize,
        Deserialize,
    )
)]
pub struct CustomerName(String);

impl CustomerName {
    /// Retorna o nome como string slice (compatibilidade)
    pub fn as_str(&self) -> &str {
        self.as_ref()
    }
}

// Conversão do erro gerado pelo nutype para nosso ValidationError
impl_nutype_error_conversion!(CustomerNameError);
