import Barco, { BarcoTipo } from './barco';
import Mapa, { EstadoCelda } from './mapa';

export default class Jugador {
  public mapaFlota: Mapa = new Mapa();
  public mapaDeAtaques: Mapa = new Mapa();

  public estado: string = 'ENPREPARACION';

  public barcos: Barco[] = [
    new Barco(
      1,
      0,
      0,
      BarcoTipo.PORTAAVIONES,
      'VERTICAL',
      0,
      false,
      'PORTAAVIONES',
    ),
    new Barco(2, 1, 0, BarcoTipo.ACORAZADO, 'VERTICAL', 0, false, 'ACORAZADO'),
    new Barco(3, 2, 0, BarcoTipo.ACORAZADO, 'VERTICAL', 0, false, 'ACORAZADO'),
    new Barco(4, 3, 0, BarcoTipo.ACORAZADO, 'VERTICAL', 0, false, 'ACORAZADO'),
    new Barco(
      5,
      4,
      0,
      BarcoTipo.DESTRUCTOR,
      'VERTICAL',
      0,
      false,
      'DESTRUCTOR',
    ),
    new Barco(
      6,
      5,
      0,
      BarcoTipo.DESTRUCTOR,
      'VERTICAL',
      0,
      false,
      'DESTRUCTOR',
    ),
    new Barco(
      7,
      6,
      0,
      BarcoTipo.DESTRUCTOR,
      'VERTICAL',
      0,
      false,
      'DESTRUCTOR',
    ),
    new Barco(8, 7, 0, BarcoTipo.FRAGATA, 'VERTICAL', 0, false, 'FRAGATA'),
    new Barco(9, 8, 0, BarcoTipo.FRAGATA, 'VERTICAL', 0, false, 'FRAGATA'),
  ];

  constructor() {
    this.mapaFlota.setBarcos(this.barcos);
  }

  prepararFlota(barcosJSON: Barco[]) {
    this.barcos = [];
    barcosJSON.forEach((barco, index) => {
      this.barcos.push(
        new Barco(
          barco.id,
          barco.x,
          barco.y,
          barco.longitud,
          barco.orientacion,
          0,
          false,
          barco.tipoNave,
        ),
      );
    });
    this.mapaFlota.setBarcos(this.barcos);
    this.cambiaEstado('ENESPERA');
  }

  realizarDisparo(x: number, y: number, rival: Jugador): boolean {
    const acierto = rival.mapaFlota.verificaDisparo(x, y);
    this.mapaDeAtaques.marcaDisparo(
      x,
      y,
      acierto ? EstadoCelda.Golpe : EstadoCelda.Agua,
    );
    return acierto;
  }

  haPerdido(): boolean {
    for (const barco of this.barcos) {
      if (!barco.destruido) {
        return false;
      }
    }
    return true;
  }

  cambiaEstado(estado: string) {
    this.estado = estado;
  }

  toJSON() {
    return {
      mapaFlota: this.mapaFlota,
      mapaDeAtaques: this.mapaDeAtaques,
      estado: this.estado,
    };
  }
}
