import {
  Column,
  CreateDateColumn,
  Entity,
  Index,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
  Unique,
} from "typeorm";
import { Identidad } from "./identidad.entity";
import { Tenant } from "./tenant.entity";

export enum MembershipEstado {
  ACTIVA = "activa",
  REVOCADA = "revocada",
}

// El grant explicito de acceso a un tenant. NO cachea rol ni tienda: eso vive
// en taller_usuarios del tenant y se lee en vivo en cada login/switch, para
// que nunca haya drift entre lo que dice el plano de control y lo que dice
// el tenant. usuarioLocalId es el id numerico en taller_usuarios de ESE
// tenant — no hay FK real posible entre bases distintas, es una referencia
// blanda a proposito.
@Entity("tenant_membership")
@Unique(["identidadId", "tenantId"])
export class TenantMembership {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ name: "identidad_id" })
  @Index()
  identidadId: number;

  @ManyToOne(() => Identidad)
  @JoinColumn({ name: "identidad_id" })
  identidad: Identidad;

  @Column({ name: "tenant_id" })
  @Index()
  tenantId: number;

  @ManyToOne(() => Tenant)
  @JoinColumn({ name: "tenant_id" })
  tenant: Tenant;

  @Column({ name: "usuario_local_id", type: "int" })
  usuarioLocalId: number;

  @Column({ type: "enum", enum: MembershipEstado, default: MembershipEstado.ACTIVA })
  estado: MembershipEstado;

  @Column({ name: "otorgado_por_identidad_id", type: "int" })
  otorgadoPorIdentidadId: number;

  @CreateDateColumn({ name: "otorgado_en" })
  otorgadoEn: Date;

  @Column({ name: "revocado_en", type: "datetime", nullable: true })
  revocadoEn: Date | null;
}
