use std::mem::transmute;
use core::fmt;

#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum MoveFlag {
    WEnPassant,
    BEnPassant,
    WDoublePawn,
    BDoublePawn,
    WKCastle,
    WQCastle,
    BKCastle,
    BQCastle,
    PromoN,
    PromoB,
    PromoR,
    PromoQ,
}

impl MoveFlag {
    #[inline(always)]
    pub fn is_promotion(self) -> bool {
        matches!(self, Self::PromoQ | Self::PromoR | Self::PromoB | Self::PromoN)
    }

    #[inline(always)]
    pub fn is_castle(self) -> bool {
        matches!(self, Self::WKCastle | Self::WQCastle | Self::BKCastle | Self::BQCastle)
    }
}

impl From<u8> for MoveFlag {
    #[inline(always)]
    fn from(number: u8) -> Self {
        unsafe { transmute::<u8, Self>(number) }
    }
}

impl fmt::Display for MoveFlag {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        f.pad(match self {
            MoveFlag::WDoublePawn => "Double Pawn Push",
            MoveFlag::BDoublePawn => "Double Pawn Push",
            MoveFlag::WEnPassant => "En-passant",
            MoveFlag::BEnPassant => "En-passant",
            MoveFlag::WKCastle => "Kingside Castle",
            MoveFlag::WQCastle => "Queenside Castle",
            MoveFlag::BKCastle => "Kingside Castle",
            MoveFlag::BQCastle => "Queenside Castle",
            MoveFlag::PromoN => "Knight Promotion",
            MoveFlag::PromoB => "Bishop Promotion",
            MoveFlag::PromoR => "Rook Promotion",
            MoveFlag::PromoQ => "Queen Promotion",
        })
    }
}
