import {
  Entity, PrimaryGeneratedColumn, Column,
  ManyToOne, JoinColumn, CreateDateColumn, UpdateDateColumn
} from 'typeorm';
import { User } from '../../users/entities/user.entity';
import { LeaveType } from './leave-type.entity';

export enum LeaveStatus {
  PENDING_N1 = 'pending_n1',
  PENDING_N2 = 'pending_n2',
  PENDING_N3 = 'pending_n3',
  APPROVED = 'approved',
  REJECTED = 'rejected',
  CANCELLED = 'cancelled',
}

@Entity('leave_requests')
export class LeaveRequest {
  @PrimaryGeneratedColumn({ unsigned: true })
  id: number;

  @ManyToOne(() => User)
  @JoinColumn({ name: 'user_id' })
  user: User;

  @ManyToOne(() => LeaveType)
  @JoinColumn({ name: 'leave_type_id' })
  leave_type: LeaveType;

  @Column({ type: 'date' })
  start_date: Date;

  @Column({ type: 'date' })
  end_date: Date;

  @Column({ type: 'decimal', precision: 4, scale: 1 })
  days_count: number;

  @Column({ type: 'text', nullable: true })
  reason: string;

  @Column({ length: 255, nullable: true })
  attachment_url: string;

  @Column({ type: 'enum', enum: LeaveStatus, default: LeaveStatus.PENDING_N1 })
  status: LeaveStatus;

  @ManyToOne(() => User, { nullable: true })
  @JoinColumn({ name: 'n1_validator_id' })
  n1_validator: User;

  @Column({ type: 'timestamp', nullable: true })
  n1_validated_at: Date;

  @Column({ type: 'text', nullable: true })
  n1_comment: string;

  @ManyToOne(() => User, { nullable: true })
  @JoinColumn({ name: 'n2_validator_id' })
  n2_validator: User;

  @Column({ type: 'timestamp', nullable: true })
  n2_validated_at: Date;

  @Column({ type: 'text', nullable: true })
  n2_comment: string;

  @ManyToOne(() => User, { nullable: true })
  @JoinColumn({ name: 'n3_validator_id' })
  n3_validator: User;

  @Column({ type: 'timestamp', nullable: true })
  n3_validated_at: Date;

  @Column({ type: 'text', nullable: true })
  n3_comment: string;

  @CreateDateColumn()
  created_at: Date;

  @UpdateDateColumn()
  updated_at: Date;
}