module Chess.Internal.Piece (Piece(..), Color(..), PieceType(..), opponent, printPiece,
                    parsePiece, parsePieceType) where

import Data.Char

data Piece = Piece Color PieceType
           deriving (Show, Eq)

data Color = White | Black
           deriving (Show, Eq)

data PieceType = Pawn | Knight | Bishop | Rook | Queen | King
           deriving (Show, Eq)

opponent :: Color -> Color
opponent White = Black
opponent Black = White

pieceChars :: [(PieceType, Char)]
pieceChars = [(Pawn, 'P'), (Knight, 'N'), (Bishop, 'B'), (Rook, 'R'), (Queen, 'Q'), (King, 'K')]

printPiece :: Piece -> String
printPiece (Piece color pieceType) = case color of
                               White -> [toUpper c]
                               Black -> [toLower c]
    where (Just c) = lookup pieceType pieceChars

parsePiece :: Char -> Maybe Piece
parsePiece c = do
  pieceType <- parsePieceType c
  return (if isUpper c then Piece White pieceType else Piece Black pieceType)

parsePieceType :: Char -> Maybe PieceType
parsePieceType c = rlookup (toUpper c) pieceChars
    where rlookup x = lookup x . map swap
          swap (x, y) = (y, x)