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

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

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

  @Column({
    nullable: true,
    comment: "เรียงลำดับใหมาตามการนำเข้า",
    default: null,
  })
  order: number;

  @Column({
    nullable: true,
    comment: "เลขที่คำสั่ง",
    default: null,
  })
  commandNo: string;

  @Column({
    nullable: true,
    comment: "ปีที่ออกคำสั่ง",
    default: null,
  })
  commandYear: number;

  @Column({
    comment: "คำสั่งวันที่",
    type: "datetime",
    nullable: true,
  })
  commandDateSign: Date;

  @Column({
    comment: "คำสั่งมีผลวันที่",
    type: "datetime",
    nullable: true,
  })
  commandDateAffect: Date;

  @Column({
    nullable: true,
    comment: "รหัสประเภทของคำสั่ง",
    default: null,
  })
  commandCode: string;

  @Column({
    nullable: true,
    comment: "ชื่อประเภทคำสั่ง",
    default: null,
  })
  commandName: string;

  @Column({
    nullable: true,
    length: 40,
    comment: "ตัวย่อเลขที่ตำแหน่ง",
    default: null,
  })
  posNoAbb: string;

  @Column({
    nullable: true,
    length: 40,
    comment: "เลขที่ตำแหน่ง",
    default: null,
  })
  posNo: string;

  @Column({
    nullable: true,
    length: 255,
    comment: "ตำแหน่ง",
    default: null,
  })
  positionName: string;

  @Column({
    nullable: true,
    length: 255,
    comment: "ประเภทตำแหน่ง",
    default: null,
  })
  positionType: string;

  @Column({
    nullable: true,
    length: 255,
    comment: "ระดับตำแหน่ง",
    default: null,
  })
  positionLevel: string;

  @Column({
    nullable: true,
    comment: "ระดับของเก่าที่ยังไม่เทียบเท่าแบบแท่ง",
    default: null,
  })
  positionCee: string;

  @Column({
    nullable: true,
    comment: "root name",
    default: null,
  })
  orgRoot: string;

  @Column({
    nullable: true,
    comment: "child1 name",
    default: null,
  })
  orgChild1: string;

  @Column({
    nullable: true,
    comment: "child2 name",
    default: null,
  })
  orgChild2: string;

  @Column({
    nullable: true,
    comment: "child3 name",
    default: null,
  })
  orgChild3: string;

  @Column({
    nullable: true,
    comment: "child4 name",
    default: null,
  })
  orgChild4: string;

  @Column({
    nullable: true,
    length: 255,
    comment: "ตำแหน่งทางการบริหาร",
    default: null,
  })
  positionExecutive: string;

  @Column({
    comment: "เงินเดือนฐาน",
    default: 0,
    nullable: true,
    type: "double",
  })
  amount: Double;

  @Column({
    comment: "เงินพิเศษ",
    default: 0,
    nullable: true,
    type: "double",
  })
  amountSpecial: Double;

  @Column({
    comment: "เงินประจำตำแหน่ง",
    default: 0,
    nullable: true,
    type: "double",
  })
  positionSalaryAmount: Double;

  @Column({
    comment: "เงินค่าตอบแทนรายเดือน",
    default: 0,
    nullable: true,
    type: "double",
  })
  mouthSalaryAmount: Double;

  @Column({
    nullable: true,
    type: "text",
    comment: "หมายเหตุ",
    default: null,
  })
  remark: string;

  @Column({
    nullable: true,
    comment: "refId",
    default: null,
  })
  refId: string;

  @Column({
    comment: "วันที่",
    type: "datetime",
    nullable: true,
  })
  dateGovernment: Date;

  @Column({
    nullable: true,
    comment: "เข้ารับราชการ",
    default: null,
  })
  isGovernment: boolean;

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

  @Column({
    nullable: true,
    length: 255,
    comment: "ด้านของตำแหน่ง",
    default: null,
  })
  positionPathSide: string;

  @Column({
    nullable: true,
    length: 255,
    comment: "ตำแหน่งในสายงาน",
    default: null,
  })
  positionLine: string;

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

  @Column({
    nullable: true,
    length: 255,
    comment: "หน่วยงานที่ออกคำสั่ง",
    default: null,
  })
  posNumCodeSit: string;

  @Column({
    nullable: true,
    length: 255,
    comment: "หน่วยงานที่ออกคำสั่ง(ตัวย่อ)",
    default: null,
  })
  posNumCodeSitAbb: string;

  @Column({
    nullable: true,
    length: 255,
    comment: "ด้านทางการบริหาร",
    default: null,
  })
  positionExecutiveField: string;

  @Column({
    nullable: true,
    length: 255,
    comment: "ด้าน/สาขา",
    default: null,
  })
  positionArea: string;

  @ManyToOne(() => Command, (command) => command.profileSalarys)
  @JoinColumn({ name: "commandId" })
  command: Command;

  @OneToMany(() => ProfileSalaryHistory, (profileSalaryHistory) => profileSalaryHistory.histories)
  profileSalaryHistories: ProfileSalaryHistory[];

  @OneToMany(() => ProfileSalaryTemp, (profileSalaryTemp) => profileSalaryTemp.profileSalary)
  profileSalaryTemps: ProfileSalaryTemp[];

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

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

export class CreateProfileSalary {
  profileId: string | null;
  commandCode?: string | null;
  commandNo?: string | null;
  commandYear?: number | null;
  commandDateAffect?: Date | null;
  commandDateSign?: Date | null;
  posNoAbb: string | null;
  posNo: string | null;
  positionName: string | null;
  positionType: string | null;
  positionLevel: string | null;
  positionLine?: string | null;
  positionPathSide?: string | null;
  positionExecutive?: string | null;
  positionExecutiveField?: string | null;
  positionArea?: string | null;
  amount?: Double | null;
  amountSpecial?: Double | null;
  positionSalaryAmount?: Double | null;
  mouthSalaryAmount?: Double | null;
  orgRoot?: string | null;
  orgChild1?: string | null;
  orgChild2?: string | null;
  orgChild3?: string | null;
  orgChild4?: string | null;
  remark: string | null;
  commandId?: string | null;
  isGovernment?: boolean | null;
  positionCee?: string | null;
  commandName?: string | null;
  posNumCodeSit?: string | null;
  posNumCodeSitAbb?: string | null;
}

export class CreateProfileSalaryEmployee {
  profileEmployeeId: string | null;
  commandCode?: string | null;
  commandNo?: string | null;
  commandYear?: number | null;
  commandDateAffect?: Date | null;
  commandDateSign?: Date | null;
  posNoAbb: string | null;
  posNo: string | null;
  positionName: string | null;
  positionType: string | null;
  positionLevel: string | null;
  positionLine?: string | null;
  positionPathSide?: string | null;
  positionExecutive?: string | null;
  positionExecutiveField?: string | null;
  positionArea?: string | null;
  amount?: Double | null;
  amountSpecial?: Double | null;
  positionSalaryAmount?: Double | null;
  mouthSalaryAmount?: Double | null;
  orgRoot?: string | null;
  orgChild1?: string | null;
  orgChild2?: string | null;
  orgChild3?: string | null;
  orgChild4?: string | null;
  remark: string | null;
  commandId?: string | null;
  isGovernment?: boolean | null;
  positionCee?: string | null;
  commandName?: string | null;
  posNumCodeSit?: string | null;
  posNumCodeSitAbb?: string | null;
  salaryLevel?: number | null;
  group?: number | null;
}

export class UpdateProfileSalaryEmployee {
  commandCode?: string | null;
  commandNo?: string | null;
  commandYear?: number | null;
  commandDateAffect?: Date | null;
  commandDateSign?: Date | null;
  posNoAbb: string | null;
  posNo: string | null;
  positionName: string | null;
  positionType: string | null;
  positionLevel: string | null;
  positionLine?: string | null;
  positionPathSide?: string | null;
  positionExecutive?: string | null;
  positionExecutiveField?: string | null;
  positionArea?: string | null;
  amount?: Double | null;
  amountSpecial?: Double | null;
  positionSalaryAmount?: Double | null;
  mouthSalaryAmount?: Double | null;
  orgRoot?: string | null;
  orgChild1?: string | null;
  orgChild2?: string | null;
  orgChild3?: string | null;
  orgChild4?: string | null;
  remark: string | null;
  commandId?: string | null;
  isGovernment?: boolean | null;
  positionCee?: string | null;
  commandName?: string | null;
  posNumCodeSit?: string | null;
  posNumCodeSitAbb?: string | null;
  salaryLevel?: number | null;
  group?: number | null;
}

export type UpdateProfileSalary = {
  commandCode?: string | null;
  commandNo?: string | null;
  commandYear?: number | null;
  commandDateAffect?: Date | null;
  commandDateSign?: Date | null;
  posNoAbb: string | null;
  posNo: string | null;
  positionName: string | null;
  positionType: string | null;
  positionLevel: string | null;
  positionLine?: string | null;
  positionPathSide?: string | null;
  positionExecutive?: string | null;
  positionExecutiveField?: string | null;
  positionArea?: string | null;
  amount?: Double | null;
  amountSpecial?: Double | null;
  positionSalaryAmount?: Double | null;
  mouthSalaryAmount?: Double | null;
  orgRoot?: string | null;
  orgChild1?: string | null;
  orgChild2?: string | null;
  orgChild3?: string | null;
  orgChild4?: string | null;
  remark: string | null;
  commandId?: string | null;
  isGovernment?: boolean | null;
  positionCee?: string | null;
  commandName?: string | null;
  posNumCodeSit?: string | null;
  posNumCodeSitAbb?: string | null;
};
