use pagetop::prelude::*;

// **< ScaleSize >**********************************************************************************

/// Escala discreta de tamaños para definir clases utilitarias.
#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)]
pub enum ScaleSize {
    /// Sin tamaño (no define ninguna clase).
    #[default]
    None,
    /// Tamaño automático.
    Auto,
    /// Escala cero.
    Zero,
    /// Escala uno.
    One,
    /// Escala dos.
    Two,
    /// Escala tres.
    Three,
    /// Escala cuatro.
    Four,
    /// Escala cinco.
    Five,
}

impl ScaleSize {
    // Devuelve el sufijo para el tamaño (`"-0"`, `"-1"`, etc.), o `None` si no define ninguna
    // clase, o `""` para el tamaño automático.
    #[rustfmt::skip]
    #[inline]
    const fn suffix(self) -> Option<&'static str> {
        match self {
            Self::None  => None,
            Self::Auto  => Some(""),
            Self::Zero  => Some("-0"),
            Self::One   => Some("-1"),
            Self::Two   => Some("-2"),
            Self::Three => Some("-3"),
            Self::Four  => Some("-4"),
            Self::Five  => Some("-5"),
        }
    }

    // Añade el tamaño a la cadena de clases usando el prefijo dado.
    #[inline]
    pub(crate) fn push_class(self, classes: &mut String, prefix: &str) {
        if !prefix.is_empty() {
            if let Some(suffix) = self.suffix() {
                if !classes.is_empty() {
                    classes.push(' ');
                }
                classes.push_str(prefix);
                classes.push_str(suffix);
            }
        }
    }

    /* Devuelve la clase del tamaño para el prefijo, o una cadena vacía si no aplica (reservado).
    //
    // # Ejemplo
    //
    // ```rust
    // # use pagetop_bootsier::prelude::*;
    // assert_eq!(ScaleSize::Auto.class_with("border"), "border");
    // assert_eq!(ScaleSize::Zero.class_with("m"), "m-0");
    // assert_eq!(ScaleSize::Three.class_with("p"), "p-3");
    // assert_eq!(ScaleSize::None.class_with("border"), "");
    // ```
    #[inline]
    pub(crate) fn class_with(self, prefix: &str) -> String {
        if !prefix.is_empty() {
            if let Some(suffix) = self.suffix() {
                let mut class = String::with_capacity(prefix.len() + suffix.len());
                class.push_str(prefix);
                class.push_str(suffix);
                return class;
            }
        }
        String::new()
    } */
}

// **< Side >***************************************************************************************

/// Lados sobre los que aplicar una clase utilitaria (respetando LTR/RTL).
#[derive(AutoDefault, Clone, Copy, Debug, PartialEq)]
pub enum Side {
    /// Todos los lados.
    #[default]
    All,
    /// Lado superior.
    Top,
    /// Lado inferior.
    Bottom,
    /// Lado lógico de inicio (respetando RTL).
    Start,
    /// Lado lógico de fin (respetando RTL).
    End,
    /// Lados lógicos laterales (abreviatura *x*).
    LeftAndRight,
    /// Lados superior e inferior (abreviatura *y*).
    TopAndBottom,
}
