import { pos2key, invRanks } from './util.js';
import * as cg from './types.js';

export const initial: cg.FEN = 'rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR';

const roles: { [letter: string]: cg.Role } = {
  p: 'pawn',
  r: 'chariot',
  n: 'horse',
  h: 'horse',
  b: 'elephant',
  e: 'elephant',
  a: 'advisor',
  k: 'king',
  c: 'cannon',
};

const letters = {
  pawn: 'p',
  chariot: 'r',
  horse: 'n',
  elephant: 'b',
  advisor: 'a',
  king: 'k',
  cannon: 'c',
};

export function read(fen: cg.FEN): cg.Pieces {
  if (fen === 'start') fen = initial;
  const pieces: cg.Pieces = new Map();
  let row = 9,
    col = 0;
  for (const c of fen) {
    switch (c) {
      case ' ':
        return pieces;
      case '/':
        --row;
        if (row < 0) return pieces;
        col = 0;
        break;
      default: {
        const nb = c.charCodeAt(0);
        if (nb < 58) col += nb - 48;
        else {
          const role = c.toLowerCase();
          console.log(col, row);
          pieces.set(pos2key([col, row]), {
            role: roles[role],
            color: c === role ? 'black' : 'white',
          });
          ++col;
        }
      }
    }
  }
  return pieces;
}

export function write(pieces: cg.Pieces): cg.FEN {
  return invRanks
    .map(y =>
      cg.files
        .map(x => {
          const piece = pieces.get((x + y) as cg.Key);
          if (piece) {
            let p = letters[piece.role];
            if (piece.color === 'white') p = p.toUpperCase();
            return p;
          } else return '1';
        })
        .join(''),
    )
    .join('/')
    .replace(/1{2,}/g, s => s.length.toString());
}
