import {
  Column,
  Entity,
  OneToMany,
  PrimaryGeneratedColumn,
  CreateDateColumn,
  UpdateDateColumn,
  DeleteDateColumn,
  ManyToMany,
  JoinTable,
  ManyToOne,
  JoinColumn,
} from "typeorm"
import { Auth } from "../../auth/entities/auth.entity"
import { RolePermission } from "src/modules/role-permission/entities/role-permission.entity"
import { TeamMember } from "src/modules/team-member/entities/team_member.entity"
import { Department } from "src/modules/department/entities/department.entity"
import { BusinessVertical } from "src/modules/business-verticals/entities/business-verticals.entity"

@Entity("roles")
export class Role {
  @PrimaryGeneratedColumn()
  id: number

  @Column({ type: "varchar", nullable: false })
  name: string

  @Column({ type: "smallint", default: 1 })
  status: number

  @Column({ type: "varchar", nullable: true })
  description: string

  @Column({ type: "int", nullable: true })
  parent_role_id: number

  @Column({ type: "boolean", nullable: true })
  is_web_login: boolean

  @DeleteDateColumn()
  deleted_at: Date

  @CreateDateColumn({
    type: "timestamp",
    nullable: true,
    default: () => "NOW()",
  })
  created_at: Date

  @UpdateDateColumn({
    type: "timestamp",
    nullable: true,
    default: () => "NOW()",
  })
  updated_at: Date

  @OneToMany(() => Auth, (user) => user.role)
  users: Auth[]

  @OneToMany(() => RolePermission, (role_permissions) => role_permissions.role)
  role_permissions: RolePermission[]

  @OneToMany(() => TeamMember, (team_member) => team_member.role)
  team_member: TeamMember[]

  @ManyToMany(() => Department, (dept) => dept.roles)
  @JoinTable({
    name: "role_departments",
    joinColumn: { name: "role_id", referencedColumnName: "id" },
    inverseJoinColumn: { name: "department_id", referencedColumnName: "id" },
  })
  departments: Department[]

  @ManyToMany(() => BusinessVertical, (bv) => bv.roles)
  @JoinTable({
    name: "role_business_verticals",
    joinColumn: { name: "role_id", referencedColumnName: "id" },
    inverseJoinColumn: {
      name: "business_vertical_id",
      referencedColumnName: "id",
    },
  })
  business_verticals: BusinessVertical[]

  @ManyToOne(() => Role, (role) => role.child_roles, { nullable: true })
  @JoinColumn({ name: "parent_role_id" })
  parent_role: Role

  @OneToMany(() => Role, (role) => role.parent_role)
  child_roles: Role[]
}
