import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, OneToMany, CreateDateColumn, UpdateDateColumn, JoinColumn } from 'typeorm';
import { UserRole } from 'common/enum/UserRole.enum';
import { SubPermissionEntity } from './sub-permission.entity';
import { RolePermissionStateEntity } from 'modules/role-permission/roles/entities/role-permission-state.entity';

@Entity('permission')
export class PermissionEntity {
  @PrimaryGeneratedColumn('uuid', { name: 'id' })
  id: string;

  @Column({ unique: true }) // Unique identifier for the permission
  name: string;

  @Column({ name: 'display_name', type: 'varchar', length: 150, nullable: false }) // Display name for the permission, used in UI
  displayName: string;

  @Column({ nullable: true, name: 'description', type: 'text' }) // Description of the permission, providing more context
  description: string;

  @Column({
    name: 'permission_type',
    type: 'enum',
    enum: UserRole,
    default: UserRole.USER,
  }) // Enum to define the type of user role this permission applies to
  permissionType: UserRole;

  @OneToMany(() => RolePermissionStateEntity, rolePermissionState => rolePermissionState.permission)
  @JoinColumn({ name: 'role_permission_states' }) // Relationship with role permission states
  rolePermissionStates: RolePermissionStateEntity[];

  @Column({ default: true, name: 'is_active' }) // Indicates if the permission is active or not
  isActive: boolean;

  @Column({ default: false, name: 'is_system_permission' }) // Indicates if the permission is a system permission (cannot be deleted)
  isSystemPermission: boolean;

  @Column({ default: false, name: 'is_client_permission' }) // Indicates if the permission is a client permission (specific to a client)
  isClientPermission: boolean;

  // realtionships between permissions and sub-permissions can be added here if needed
  @OneToMany(() => SubPermissionEntity, subPermission => subPermission.permission, { cascade: true, eager: true })
  subPermissions: SubPermissionEntity[];

  @CreateDateColumn({ name: 'created_at' }) // Timestamp when the permission was created
  createdAt: Date;

  @UpdateDateColumn({ name: 'updated_at' }) // Timestamp when the permission was last updated
  updatedAt: Date;
}
