//! 初期局面と駒落ち局面の SFEN 定義
//!
//! [`InitialPosition`] は平手・駒落ちの各初期局面を列挙し、
//! 対応する SFEN 文字列を [`to_sfen()`](InitialPosition::to_sfen) で取得できます。
//!
//! 駒落ち局面では上手（駒を落とす側）が先に指すため、
//! 手番は後手（`w`）になります。

/// 初期局面の種類。
///
/// 平手と各種駒落ちの初期配置を SFEN 文字列として提供します。
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum InitialPosition {
    /// 平手（通常の初期配置）
    Standard,
    /// 空の盤面（駒なし）
    Empty,
    /// 香落ち（上手の左香車を除去）
    HandicapLance,
    /// 右香落ち（上手の右香車を除去）
    HandicapRightLance,
    /// 角落ち（上手の角行を除去）
    HandicapBishop,
    /// 飛車落ち（上手の飛車を除去）
    HandicapRook,
    /// 飛香落ち（上手の飛車と左香車を除去）
    HandicapRookLance,
    /// 二枚落ち（上手の飛車と角行を除去）
    Handicap2Pieces,
    /// 四枚落ち（上手の飛車・角行・両香車を除去）
    Handicap4Pieces,
    /// 六枚落ち（上手の飛車・角行・両香車・両桂馬を除去）
    Handicap6Pieces,
    /// 八枚落ち（上手の飛車・角行・両香車・両桂馬・両銀将を除去）
    Handicap8Pieces,
    /// 十枚落ち（上手の飛車・角行・両香車・両桂馬・両銀将・両金将を除去）
    Handicap10Pieces,
}

impl InitialPosition {
    /// この初期局面に対応する SFEN 文字列を返す。
    #[must_use]
    pub const fn to_sfen(self) -> &'static str {
        match self {
            Self::Standard => "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1",
            Self::Empty => "9/9/9/9/9/9/9/9/9 b - 1",
            Self::HandicapLance => {
                "lnsgkgsn1/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1"
            }
            Self::HandicapRightLance => {
                "1nsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1"
            }
            Self::HandicapBishop => "lnsgkgsnl/1r7/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1",
            Self::HandicapRook => "lnsgkgsnl/7b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1",
            Self::HandicapRookLance => {
                "lnsgkgsn1/7b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1"
            }
            Self::Handicap2Pieces => "lnsgkgsnl/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1",
            Self::Handicap4Pieces => "1nsgkgsn1/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1",
            Self::Handicap6Pieces => "2sgkgs2/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1",
            Self::Handicap8Pieces => "3gkg3/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1",
            Self::Handicap10Pieces => "4k4/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1",
        }
    }
}
