#[cfg(feature = "serde_support")]
use serde::{Deserialize, Serialize};
use crate::tokens::ControlWord;
#[cfg_attr(feature = "serde_support", derive(Deserialize, Serialize))]
#[derive(Debug, Default, Clone, PartialEq, Hash)]
pub struct Paragraph {
    pub alignment: Alignment,
    pub spacing: Spacing,
    pub indent: Indentation,
    pub tab_width: i32,
}
#[cfg_attr(feature = "serde_support", derive(Deserialize, Serialize))]
#[derive(Debug, Default, Clone, Copy, PartialEq, Hash)]
pub enum Alignment {
    #[default]
    LeftAligned, RightAligned, Center,       Justify,      }
impl From<&ControlWord<'_>> for Alignment {
    fn from(cw: &ControlWord) -> Self {
        return match cw {
            ControlWord::LeftAligned  => Alignment::LeftAligned,
            ControlWord::RightAligned => Alignment::RightAligned,
            ControlWord::Center       => Alignment::Center,
            ControlWord::Justify      => Alignment::Justify,
            _  => Alignment::LeftAligned,
        };
    }
}
#[cfg_attr(feature = "serde_support", derive(Deserialize, Serialize))]
#[derive(Debug, Default, Clone, PartialEq, Hash)]
pub struct Spacing {
    pub before: i32,
    pub after: i32,
    pub between_line: SpaceBetweenLine,
    pub line_multiplier: i32,
}
#[cfg_attr(feature = "serde_support", derive(Deserialize, Serialize))]
#[derive(Default, Debug, Clone, PartialEq, Hash)]
pub enum SpaceBetweenLine {
    Value(i32),
    #[default]
    Auto,
    Invalid,
}
impl From<i32> for SpaceBetweenLine {
    fn from(value: i32) -> Self {
        return match value {
            1000 => SpaceBetweenLine::Auto,
            val if val < 0 => SpaceBetweenLine::Value(val.abs()),
            val => SpaceBetweenLine::Value(val),
        };
    }
}
#[cfg_attr(feature = "serde_support", derive(Deserialize, Serialize))]
#[derive(Default, Debug, Clone, PartialEq, Hash)]
pub struct Indentation {
    pub left: i32,
    pub right: i32,
    pub first_line: i32,
}