use enumflags2::{BitFlags, bitflags};
use ratatui::{layout::Constraint, macros::constraints};

#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct LogLayout(BitFlags<LogLayoutFlag>);

#[bitflags]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[repr(u8)]
enum LogLayoutFlag {
    History = 0b001,
    Files = 0b010,
    Diff = 0b100,
}

impl Default for LogLayout {
    fn default() -> Self {
        Self::HISTORY_FILES
    }
}

impl From<BitFlags<LogLayoutFlag>> for LogLayout {
    fn from(value: BitFlags<LogLayoutFlag>) -> Self {
        Self(value)
    }
}

impl LogLayout {
    pub const HISTORY: Self = Self(BitFlags::<LogLayoutFlag>::from_bits_truncate_c(
        LogLayoutFlag::History as u8,
        BitFlags::CONST_TOKEN,
    ));

    pub const HISTORY_FILES: Self = Self(BitFlags::<LogLayoutFlag>::from_bits_truncate_c(
        LogLayoutFlag::History as u8 | LogLayoutFlag::Files as u8,
        BitFlags::CONST_TOKEN,
    ));

    pub const FILES_DIFF: Self = Self(BitFlags::<LogLayoutFlag>::from_bits_truncate_c(
        LogLayoutFlag::Files as u8 | LogLayoutFlag::Diff as u8,
        BitFlags::CONST_TOKEN,
    ));

    pub const DIFF: Self = Self(BitFlags::<LogLayoutFlag>::from_bits_truncate_c(
        LogLayoutFlag::Diff as u8,
        BitFlags::CONST_TOKEN,
    ));

    pub fn constraints(&self) -> &'static [Constraint] {
        [
            (LogLayoutFlag::History.into(), constraints![*=1].as_slice()),
            (
                LogLayoutFlag::History | LogLayoutFlag::Files,
                &constraints![==2/5, ==3/5],
            ),
            (
                LogLayoutFlag::Files | LogLayoutFlag::Diff,
                &constraints![==2/5, ==3/5],
            ),
        ]
        .iter()
        .find_map(|v| (self.0 == v.0).then_some(v.1))
        .unwrap_or(&[])
    }
}