import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  OneToMany,
  CreateDateColumn,
  UpdateDateColumn,
} from 'typeorm';
import { Attendance } from '../attendance/attendance.entity';
import { LeaveRequest } from 'src/leave/leave-request.entity';
import { LeaveBalance } from 'src/leave/leave-balance.entity';
import { Notification } from 'src/notifications/notification.entity';
import { AttendanceMethod } from 'common/enums/attendance-method.enum';
import { Exclude } from 'class-transformer';
import { Department, EmploymentType, UserRole, WorkMode } from 'common/enums/user.enum';


@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ unique: true })
  email: string;

  @Exclude()
  @Column()
  password: string;

  @Column()
  name: string;

  @Column({ type: 'enum', enum: UserRole, default: UserRole.EMPLOYEE })
  role: UserRole;

  @Column({
    type: 'enum',
    enum: AttendanceMethod,
    default: AttendanceMethod.GPS,
  })
  attendanceMethod: AttendanceMethod;

  @Column({ nullable: true })
  biometricDeviceId: string;

  @Column({
    type: 'enum',
    enum: EmploymentType,
    default: EmploymentType.FULL_TIME,
  })
  employmentType: EmploymentType;

  @Column({
    type: 'enum',
    enum: WorkMode,
    default: WorkMode.OFFICE,
  })
  workMode: WorkMode;

  @Column({ default: true })
  isActive: boolean;

  @Column({
    type: 'enum',
    enum: Department,
    default: Department.SOFTWARE,
  })
  department: Department;

  @Column({ type: 'date', nullable: true })
  hireDate: Date;

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;

  @OneToMany(() => Attendance, (attendance) => attendance.user)
  attendanceRecords: Attendance[];

  @OneToMany(() => LeaveRequest, (leave) => leave.user)
  leaveRequests: LeaveRequest[];

  @OneToMany(() => LeaveBalance, (balance) => balance.user)
  leaveBalances: LeaveBalance[];

  @OneToMany(() => Notification, (notification) => notification.user)
  notifications: Notification[];
}
