import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  UpdateDateColumn,
  OneToMany,
  ManyToMany,
  JoinTable,
  ManyToOne,
  JoinColumn,
} from 'typeorm';
import { UserRole, UserStatus } from '../../../common/enum/UserRole.enum';
import { Ticket } from '../../../modules/ticket/entities/ticket.entity';
import { ApiKey } from '../../../modules/feature/api-key/entities/api-key.entity';
import { ClientEntity } from 'modules/client/entities/client.entity';
import { RoleEntity } from 'modules/role-permission/roles/entities/role.entity';
import { UserPermissionOverrideEntity } from 'modules/role-permission/roles/entities/user-permission-override.entity';

@Entity('users')
export class UserEntity {
  @PrimaryGeneratedColumn()
  id: number;

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

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

  @Column({ name: 'email', type: 'varchar', length: 100, unique: true, nullable: false })
  email: string;

  @Column({ name: 'is_email_verified', type: 'boolean', default: false })
  isEmailVerified: boolean;

  @Column({ name: 'email_verification_token', type: 'varchar', nullable: true })
  emailVerificationToken?: string;

  @Column({ name: 'email_verification_token_expires_at', type: 'timestamp', nullable: true })
  emailVerificationTokenExpiresAt?: Date;

  @Column({ name: 'email_verified_at', type: 'timestamp', nullable: true })
  emailVerifiedAt?: Date;

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

  @Column({
    name: 'role',
    type: 'enum',
    enum: UserRole,
    default: UserRole.USER,
  })
  role: UserRole;

  // ===== NEW IAM FIELDS =====
  @ManyToOne(() => ClientEntity, { nullable: true })
  @JoinColumn({ name: 'client_id' })
  planClient?: ClientEntity;

  @Column({ type: 'uuid', name: 'client_id', nullable: true })
  clientId: string;

  @ManyToOne(() => ClientEntity, client => client.linkedUsers, { nullable: true, eager: true })
  @JoinColumn({ name: 'linked_client_id' })
  linkedClient: ClientEntity;

  @Column({ type: 'uuid', name: 'linked_client_id', nullable: true })
  linkedClientId: string;

  @Column({
    type: 'enum',
    enum: UserStatus,
    default: UserStatus.ACTIVE,
  })
  status: UserStatus;

  @ManyToMany(() => RoleEntity, role => role.users)
  @JoinTable({
    name: 'user_roles', // ✅ this should be a unique join table
    joinColumn: { name: 'user_id', referencedColumnName: 'id' },
    inverseJoinColumn: { name: 'role_id', referencedColumnName: 'id' },
  })
  roles: RoleEntity[];

  @OneToMany(() => UserPermissionOverrideEntity, override => override.user, {
    cascade: true,
    eager: true,
  })
  permissionOverrides: UserPermissionOverrideEntity[];

  @Column({ name: 'referral_mail', type: 'varchar', nullable: true })
  referralMail?: string;

  @Column({ name: 'picture', type: 'varchar', nullable: true, default: 'https://cdn-icons-png.flaticon.com/512/149/149071.png' })
  picture?: string;

  @Column({ name: 'google_id', type: 'varchar', nullable: true })
  googleId?: string;

  @Column({ name: 'is_google_user', type: 'boolean', nullable: true })
  isGoogleUser?: boolean;

  // @OneToMany(() => Ticket, ticket => ticket.author)
  // tickets: Ticket[];

  @OneToMany(() => Ticket, ticket => ticket.assignee)
  assignedTickets: Ticket[];

  // @OneToMany(() => Comment, comment => comment.author)
  // comments: Comment[];

  @OneToMany(() => ApiKey, apiKey => apiKey.user)
  apiKeys: ApiKey[];

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

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