import {
  Entity, PrimaryGeneratedColumn, Column,
  ManyToOne, OneToMany, OneToOne,
  CreateDateColumn, UpdateDateColumn, JoinColumn
} from 'typeorm';
import { Team } from '../../teams/entities/team.entity';
import { Agency } from '../../teams/entities/agency.entity';

export enum Role {
  EMPLOYEE = 'employee',
  TEAM_LEAD = 'team_lead',
  AGENCY_MANAGER = 'agency_manager',
  DIRECTOR = 'director',
  ADMIN = 'admin',
}

export enum WorkSchedule {
  FOUR_DAYS = '4d',
  FIVE_DAYS = '5d',
  SIX_DAYS = '6d',
}

@Entity('users')
export class User {
  @PrimaryGeneratedColumn({ unsigned: true })
  id: number;

  @Column({ unique: true, length: 20 })
  matricule: string;

  @Column({ length: 100 })
  first_name: string;

  @Column({ length: 100 })
  last_name: string;

  @Column({ unique: true, length: 150 })
  email: string;

  @Column({ length: 255 })
  password_hash: string;

  @Column({ type: 'enum', enum: Role })
  role: Role;

  @ManyToOne(() => Team, { nullable: true })
  @JoinColumn({ name: 'team_id' })
  team: Team;

  @ManyToOne(() => Agency, { nullable: true })
  @JoinColumn({ name: 'agency_id' })
  agency: Agency;

  @Column({ type: 'enum', enum: WorkSchedule, default: WorkSchedule.FIVE_DAYS })
  work_schedule: WorkSchedule;

  @Column({ type: 'date' })
  hired_at: Date;

  @Column({ default: true })
  is_active: boolean;

  @Column({ length: 255, nullable: true })
  avatar_url: string;

  @Column({ type: 'varchar', length: 255, nullable: true, default: null })
  reset_token: string | null;

  @Column({ type: 'timestamp', nullable: true })
  reset_token_expires_at: Date | null;

  @CreateDateColumn()
  created_at: Date;

  @UpdateDateColumn()
  updated_at: Date;
}