import { Entity, Column, ManyToOne, JoinColumn, OneToMany } from "typeorm";
import { EntityBase } from "./base/Base";
import { Profile } from "./Profile";
import { ProfileEmployee } from "./ProfileEmployee";
import { ProfileTrainingHistory } from "./ProfileTrainingHistory";

@Entity("profileTraining")
export class ProfileTraining extends EntityBase {
  @Column({
    nullable: true,
    length: 40,
    comment: "คีย์นอก(FK)ของตาราง Profile",
    default: null,
  })
  profileId: string;

  @Column({
    nullable: true,
    length: 40,
    comment: "คีย์นอก(FK)ของตาราง ProfileEmployee",
    default: null,
  })
  profileEmployeeId: string;

  @Column({
    nullable: true,
    type: "datetime",
    comment: "วันเริ่มต้นการฝึกอบรม/ดูงาน ",
    default: null,
  })
  startDate: Date;

  @Column({
    nullable: true,
    type: "datetime",
    comment: "วันสิ้นสุดการฝึกอบรม/ดูงาน ",
    default: null,
  })
  endDate: Date;

  @Column({
    nullable: true,
    length: 200,
    comment: "เลขที่คำสั่ง/เลขที่หนังสืออนุมัติ ",
    default: null,
  })
  numberOrder: string;

  @Column({
    nullable: true,
    length: 200,
    comment: "หัวข้อการฝึกอบรม/ดูงาน ",
    default: null,
  })
  topic: string;

  @Column({
    type: 'longtext',
    nullable: true,
    comment: "สถานที่ฝึกอบรม/ดูงาน",
    default: null,
  })
  place: string;

  @Column({
    nullable: true,
    type: "datetime",
    comment: "คำสั่งลงวันที่/หนังสืออนุมัติลงวันที่ ",
    default: null,
  })
  dateOrder: Date;

  @Column({
    nullable: true,
    length: 200,
    comment: "หน่วยงานที่รับผิดชอบจัดการฝึกอบรม/ดูงาน  ",
    default: null,
  })
  department: string;

  @Column({
    nullable: true,
    length: 200,
    comment: "รวมระยะเวลาในการฝึกอบรม/ดูงาน ",
    default: null,
  })
  duration: string;

  @Column({
    nullable: true,
    length: 200,
    comment: "ชื่อโครงการ/หลักสูตรการฝึกอบรม ",
    default: null,
  })
  name: string;

  @Column({
    nullable: true,
    comment: "ปีที่อบรม (พ.ศ.) ",
    default: null,
  })
  yearly: number;

  @Column({
    nullable: true,
    comment: "ประเภทช่วงเวลาการศึกษา",
    default: null,
  })
  isDate: boolean;

  @Column({
    comment: "ข้อมูลจาก Entry",
    default: false,
  })
  isEntry: boolean;

  @Column({
    nullable: true,
    length: 40,
    comment: "ไอดีโครงการ/หลักสูตรการฝึกอบรม",
    default: null,
  })
  developmentId: string;

  @Column({
    nullable: false,
    comment: "สถานะลบข้อมูลการฝึกอบรม/ดูงาน",
    default: false,
  })
  isDeleted: boolean;

  @OneToMany(
    () => ProfileTrainingHistory,
    (profileTrainingHistory) => profileTrainingHistory.histories,
  )
  profileTrainingHistories: ProfileTrainingHistory[];

  @ManyToOne(() => Profile, (profile) => profile.profileTrainings)
  @JoinColumn({ name: "profileId" })
  profile: Profile;

  @ManyToOne(() => ProfileEmployee, (ProfileEmployee) => ProfileEmployee.profileTrainings)
  @JoinColumn({ name: "profileEmployeeId" })
  profileEmployee: ProfileEmployee;
}

export class CreateProfileTraining {
  profileId: string | null;
  startDate: Date | null;
  endDate: Date | null;
  numberOrder: string | null;
  topic: string | null;
  place: string | null;
  dateOrder: Date | null;
  department: string | null;
  duration: string | null;
  name: string | null;
  yearly: number | null;
  isDate: boolean | null;
  developmentId?: string | null;
}

export class CreateProfileEmployeeTraining {
  profileEmployeeId: string | null;
  startDate: Date | null;
  endDate: Date | null;
  numberOrder: string | null;
  topic: string | null;
  place: string | null;
  dateOrder: Date | null;
  department: string | null;
  duration: string | null;
  name: string | null;
  yearly: number | null;
  isDate: boolean | null;
  developmentId?: string | null;
}

export type UpdateProfileTraining = {
  startDate?: Date | null;
  endDate?: Date | null;
  numberOrder?: string | null;
  topic?: string | null;
  place?: string | null;
  dateOrder?: Date | null;
  department?: string | null;
  duration?: string | null;
  name?: string | null;
  yearly?: number | null;
  isDate?: boolean | null;
};
