import {
  Entity,
  Column,
  CreateDateColumn,
  PrimaryColumn,
  ManyToOne,
  JoinColumn,
  Index,
} from 'typeorm';
import { Company } from './company.entity';
import { User } from '../../user/entities/user.entity';

// ═══════════════════════════════════════════════════════════════════════
// 🆕 ISSUE 5 FIX — Added status, access control, and audit trail columns.
//    Existing data is preserved — migration sets all current rows to ACTIVE.
// ═══════════════════════════════════════════════════════════════════════

@Entity('company_users')
@Index('idx_cu_user', ['user_id'])
@Index('idx_cu_status', ['status'])
export class CompanyUser {
  @PrimaryColumn()
  company_id: number;

  @PrimaryColumn()
  user_id: number;

  @Column({ type: 'varchar', length: 50, default: 'CLIENT' })
  role: string;

  // 🆕 Controls whether this user can log into the client portal.
  //    ACTIVE  = can log in (default for new + existing rows)
  //    INVITED = invite sent, OTP not yet verified
  //    DISABLED = admin revoked access — login blocked instantly
  @Column({
    type: 'enum',
    enum: ['ACTIVE', 'INVITED', 'DISABLED'],
    default: 'ACTIVE',
  })
  status: 'ACTIVE' | 'INVITED' | 'DISABLED';

  // 🆕 The email the invite was sent to (may differ from user.email)
  @Column({ type: 'varchar', length: 255, nullable: true })
  invite_email: string | null;

  // 🆕 Which admin/coordinator granted this access
  @Column({ type: 'int', nullable: true })
  granted_by_id: number | null;

  @ManyToOne(() => User, { nullable: true })
  @JoinColumn({ name: 'granted_by_id' })
  granted_by: User | null;

  // 🆕 When access was disabled (null = never disabled)
  @Column({ type: 'timestamp', nullable: true })
  disabled_at: Date | null;

  // 🆕 Which admin disabled access
  @Column({ type: 'int', nullable: true })
  disabled_by_id: number | null;

  @ManyToOne(() => User, { nullable: true })
  @JoinColumn({ name: 'disabled_by_id' })
  disabled_by: User | null;

  // 🆕 Last time this user logged into the client portal
  @Column({ type: 'timestamp', nullable: true })
  last_login_at: Date | null;

  @CreateDateColumn()
  created_at: Date;

  // ─── Relations ────────────────────────────────────────────────────
  @ManyToOne(() => Company, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'company_id' })
  company: Company;

  @ManyToOne(() => User, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'user_id' })
  user: User;
}
