import { v4 as uuidv4 } from 'uuid';
import { Injectable } from '@nestjs/common';
import { UsuariosService } from './usuarios.service';
import BattleshipGame from 'src/battleship/battleship';

export class Partida {
  constructor(
    public uuid: string,
    public uuidJugadorA: string,
    public nickJugadorA: string = null,
    public uuidJugadorB: string = null,
    public nickJugadorB: string = null,
    public abierta: boolean = true,
    public batalla: BattleshipGame = null,
  ) {}

  toJson() {
    return {
      uuid: this.uuid,
      uuidJugadorA: this.uuidJugadorA,
      nickJugadorA: this.nickJugadorA,
      uuidJugadorB: this.uuidJugadorB,
      nickJugadorB: this.nickJugadorB,
      abierta: this.abierta,
    };
  }
}

@Injectable()
export class PartidasService {
  private _partidas: Map<string, Partida> = new Map<string, Partida>();

  constructor(private readonly usuariosService: UsuariosService) {}
  get partidasAbiertas(): Partida[] {
    return Array.from(this._partidas.values()).filter(
      (partida) => partida.abierta,
    );
  }
  get partidasCerradadas(): Partida[] {
    return Array.from(this._partidas.values()).filter(
      (partida) => !partida.abierta,
    );
  }
  creaPartida(uuidJugadorA: string) {
    const uuid = uuidv4();
    const nickJugadorA =
      this.usuariosService.usuarios.get(uuidJugadorA).nickname;
    const partida = new Partida(uuid, uuidJugadorA, nickJugadorA);
    this._partidas.set(uuid, partida);
    return partida;
  }
  unirsePartida(uuidJugadorB: string, uuidPartida: string) {
    const partida = this._partidas.get(uuidPartida);
    const nickJugadorB =
      this.usuariosService.usuarios.get(uuidJugadorB)?.nickname;
    partida.uuidJugadorB = uuidJugadorB;
    partida.nickJugadorB = nickJugadorB;
    partida.abierta = false;
    partida.batalla = new BattleshipGame();
    return partida;
  }
  eliminarPartida(uuidJugador: string, uuidPartida: string) {
    if (!this._partidas.has(uuidPartida)) {
      return null;
    }
    const partida = this._partidas.get(uuidPartida);
    if (
      partida.uuidJugadorA !== uuidJugador &&
      partida.uuidJugadorB !== uuidJugador
    ) {
      return null;
    }
    this._partidas.delete(uuidPartida);
    return uuidPartida;
  }
  
  
  existePartida(uuidPartida: string, uuidJugador: string): boolean {
    if (!this._partidas.has(uuidPartida)) {
      return false;
    }   
    const partida = this._partidas.get(uuidPartida);
    return (partida.uuidJugadorA === uuidJugador || partida.uuidJugadorB === uuidJugador)
  }
  
  getSnapshotJugador(uuidPartida: string, uuidJugador: string){
    if (this.existePartida(uuidPartida,uuidJugador)){
      const partida=this._partidas.get(uuidPartida);
      return partida.uuidJugadorA === uuidJugador ? partida.batalla.jugadorA : partida.batalla.jugadorB;
    }
    return null;    
  }
 
}
