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

/// ID único do vendedor no marketplace (máximo 100 caracteres)
///
/// # Validações
/// - Não pode ser vazio (após trim)
/// - Máximo 100 caracteres
#[nutype(
    sanitize(trim),
    validate(not_empty, len_char_max = 100),
    derive(
        Debug,
        Clone,
        PartialEq,
        Eq,
        Display,
        AsRef,
        Deref,
        Serialize,
        Deserialize,
    )
)]
pub struct SellerId(String);

impl SellerId {
    pub fn as_str(&self) -> &str {
        self.as_ref()
    }
}

impl_nutype_error_conversion!(SellerIdError);

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_seller_id_valid() {
        let id = SellerId::try_new("37").unwrap();
        assert_eq!(id.as_str(), "37");
    }

    #[test]
    fn test_seller_id_alphanumeric() {
        let id = SellerId::try_new("SELLER-123-ABC").unwrap();
        assert_eq!(id.as_str(), "SELLER-123-ABC");
    }

    #[test]
    fn test_seller_id_empty() {
        let result = SellerId::try_new("");
        assert!(result.is_err());
    }

    #[test]
    fn test_seller_id_too_long() {
        let long = "a".repeat(101);
        let result = SellerId::try_new(long);
        assert!(result.is_err());
    }
}
