import {UserDTO, UserRoles} from '../../../common/entities/UserDTO';
import {IUserManager} from '../interfaces/IUserManager';
import {UserEntity} from './enitites/UserEntity';
import {SQLConnection} from './SQLConnection';
import {PasswordHelper} from '../PasswordHelper';


export class UserManager implements IUserManager {

  constructor() {
  }


  public async findOne(filter: any) {
    const connection = await SQLConnection.getConnection();
    const pass = filter.password;
    delete filter.password;
    const user = (await connection.getRepository(UserEntity).findOne(filter));

    if (user.permissions && user.permissions != null) {
      user.permissions = <any>JSON.parse(<any>user.permissions);
    }

    if (pass && !PasswordHelper.comparePassword(pass, user.password)) {
      throw new Error('No entry found');
    }
    return user;

  }

  public async find(filter: any) {
    const connection = await SQLConnection.getConnection();
    return (await connection.getRepository(UserEntity).find(filter)).map(user => {
      if (user.permissions && user.permissions != null) {
        user.permissions = <any>JSON.parse(<any>user.permissions);
      }
      return user;
    });
  }

  public async createUser(user: UserDTO) {
    const connection = await SQLConnection.getConnection();
    if (user.permissions && user.permissions != null) {
      user.permissions = <any>JSON.stringify(<any>user.permissions);
    }
    user.password = PasswordHelper.cryptPassword(user.password);
    return await connection.getRepository(UserEntity).save(user);
  }

  public async deleteUser(id: number) {
    const connection = await SQLConnection.getConnection();
    const user = await connection.getRepository(UserEntity).findOne({id: id});
    return await connection.getRepository(UserEntity).remove(user);
  }

  public async changeRole(id: number, newRole: UserRoles) {

    const connection = await SQLConnection.getConnection();
    const userRepository = connection.getRepository(UserEntity);
    const user = await userRepository.findOne({id: id});
    user.role = newRole;
    return await userRepository.save(user);

  }

  public async changePassword(request: any) {
    throw new Error('not implemented'); // TODO: implement
  }

}