﻿import {
  Column,
  CreateDateColumn,
  Entity,
  Index,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
} from "typeorm";
import { Tienda } from "./tienda.entity";

export enum UserRole {
  SUPER_ADMIN = "super_admin",
  ADMIN = "admin",
  OPERATIVO = "operativo",
  RECEPCION = "recepcion",
  MECANICO = "mecanico",
}

@Entity("taller_usuarios")
export class Usuario {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 100, unique: true })
  @Index()
  username: string;

  @Column({ length: 255, nullable: true })
  email: string;

  @Column({ name: "password_hash", length: 255 })
  passwordHash: string;

  @Column({ length: 255 })
  nombre: string;

  @Column({
    type: "enum",
    enum: UserRole,
    default: UserRole.OPERATIVO,
  })
  rol: UserRole;

  @Column({ type: "json", nullable: true })
  permisos?: Record<string, "none" | "read" | "write">;

  // null = sin restriccion -- ve/edita facturacion POS de TODAS las tiendas
  // que su permiso "configuracion.facturacion" ya le permita. Un array
  // (aunque sea de 1 elemento) restringe ademas a esas tiendas puntuales.
  // Solo tiene efecto si ese permiso es distinto de "none" -- no es un
  // permiso en si mismo, es un filtro adicional sobre uno que ya existe.
  @Column({ name: "facturacion_pos_tienda_ids", type: "json", nullable: true })
  facturacionPosTiendaIds?: number[] | null;

  // null = ve todos los estados de OT (comportamiento de siempre). Un
  // array restringe el listado Y el acceso directo por ID a esos estados
  // puntuales -- ver OtsService.ensureEstadoAccess/applyEstadoScope. Los
  // valores validos son los de EstadoOT (ots/entities/orden-trabajo.entity),
  // validados en el DTO -- no se importa el enum aca para no acoplar
  // auth/ a ots/ a nivel de entidad.
  @Column({ name: "estados_visibles", type: "json", nullable: true })
  estadosVisibles?: string[] | null;

  @Column({ name: "tienda_id", type: "int", nullable: true })
  @Index()
  tiendaId: number | null;

  @ManyToOne(() => Tienda, { nullable: true })
  @JoinColumn({ name: "tienda_id" })
  tienda: Tienda | null;

  @Column({ default: true })
  @Index()
  activo: boolean;

  @Column({ name: "ultimo_login", type: "datetime", nullable: true })
  ultimoLogin: Date;

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

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