import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, ManyToOne, CreateDateColumn, UpdateDateColumn, JoinColumn, OneToMany } from 'typeorm';

import { ClientEntity } from 'modules/client/entities/client.entity';
import { UserEntity } from 'modules/user/entity/users.entity';
import { RolePermissionStateEntity } from './role-permission-state.entity';

export enum RoleType {
  CLIENT_ROLE = 'client_role',
  ADMIN_ROLE = 'admin_role',
  CUSTOM_ROLE = 'custom_role',
}
@Entity('role')
export class RoleEntity {
  @PrimaryGeneratedColumn('uuid', { name: 'id' })
  id: string;

  @Column({ name: 'name', type: 'varchar', length: 150, nullable: false })
  name: string;

  @Column({
    name: 'role_type',
    type: 'enum',
    enum: RoleType,
  })
  roleType: RoleType;

  @Column({ name: 'is_custom', type: 'boolean', default: false })
  isCustom: boolean;

  @Column({ name: 'priority', type: 'int', default: 1 }) // Higher number = higher priority
  priority: number;

  @ManyToOne(() => ClientEntity, client => client.roles, { nullable: true })
  @JoinColumn({ name: 'client_id' })
  client: ClientEntity;

  @ManyToMany(() => UserEntity, user => user.roles)
  users: UserEntity[];

  @OneToMany(() => RolePermissionStateEntity, rolePermissionState => rolePermissionState.role)
  permissionStates: RolePermissionStateEntity[];

  @CreateDateColumn({ name: 'created_at' })
  createdAt: Date;

  @UpdateDateColumn({ name: 'updated_at' })
  updatedAt: Date;
}
