import * as bcrypt from 'bcrypt'

import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  OneToMany,
  Unique,
  CreateDateColumn,
  UpdateDateColumn
} from 'typeorm'
import {
  IsDate,
  IsEmail,
  Length,
  IsBoolean,
  IsString,
  IsOptional
} from 'class-validator'
import { Reservacion } from './Reservacion'
import { Prestamo } from './Prestamo'
import { Log } from './Log'

@Entity()
@Unique(['id', 'correoAlternativo'])
export class Usuario {
  @PrimaryGeneratedColumn()
  id: string

  @Column()
  @IsString()
  nombre: string

  @Column()
  @IsString()
  apellidoPaterno: string

  @Column()
  @IsString()
  apellidoMaterno: string

  @Column()
  @IsEmail()
  correoAlternativo: string

  @Column()
  @Length(10)
  numeroTelefonico: string

  @Column({ type: 'text' })
  @IsString()
  identificacion: string

  @Column()
  @IsString()
  institucion: string

  @Column()
  @IsString()
  secreto: string

  @Column({ type: 'date', default: '1996-11-07' })
  @IsDate()
  @IsOptional()
  multa: string

  @Column({ type: 'date', default: '1996-11-07' })
  @IsDate()
  @IsOptional()
  multaRed: string

  @Column({ default: false })
  @IsBoolean()
  @IsOptional()
  baja: boolean

  @Column({ default: false })
  @IsBoolean()
  interno: boolean

  @Column()
  @CreateDateColumn()
  createdAt: Date

  @Column()
  @UpdateDateColumn()
  updatedAt: Date

  @OneToMany(
    (type) => Reservacion,
    (reservacion) => reservacion.usuario
  )
  reservaciones: Reservacion[]

  @OneToMany(
    (type) => Prestamo,
    (prestamo) => prestamo.usuario
  )
  prestamos: Prestamo[]

  @OneToMany(
    (type) => Log,
    (log) => log.usuario
  )
  logs: Log[]

  hashPassword () {
    this.secreto = bcrypt.hashSync(this.secreto, 10)
  }

  checkIfUnencryptedPasswordIsValid (unencryptedPassword: string) {
    return bcrypt.compareSync(unencryptedPassword, this.secreto)
  }
}
