import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
import { Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';

import { PersonEntity } from './user.entity';
import { UserDTO } from './user.dto';
import { GameEntity } from '../game/game.entity';
import { GameDTO } from '../game/game.dto';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(PersonEntity)
    private userRepository: Repository<PersonEntity>,
    @InjectRepository(GameEntity)
    private gameRepository: Repository<GameEntity>,
  ) {}

  async register(data: UserDTO) {
    const { name } = data;
    let user = await this.userRepository.findOne({ where: { name } });
    if (user) {
      throw new HttpException('User already exists', HttpStatus.BAD_REQUEST);
    }
    user = await this.userRepository.create(data);
    await this.userRepository.save(user);
    return user.tokenObject();
  }

  async login(data: UserDTO) {
    const { name, password } = data;
    const user = await this.userRepository.findOne({ where: { name } });
    if (!user || !(await user.comparePassword(password))) {
      throw new HttpException('invalid password', HttpStatus.BAD_REQUEST);
    }
    return user.tokenObject();
  }

  // liitytään peliin
  async joinGame(game: GameDTO, data: UserDTO) {
    try {
      // etsi peli valinnan mukaan ja otetaan käyttäjän rooli kyseisestä pelistä talteen
      const role = await this.gameRepository.findOne();
      return role;
    } catch (error) {
      return error.message;
    }
  }

  // liitytään factionii
  async joinFaction(game: GameDTO, data: UserDTO): Promise<boolean> {
    try {
      // tarkistetaan factionin salasana
      return true;
    } catch (error) {
      return error;
    }
  }
}