﻿import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
import {
  ArrayUnique,
  IsArray,
  IsEmail,
  IsEnum,
  IsNotEmpty,
  IsObject,
  IsOptional,
  IsString,
  MinLength,
  IsInt,
  Min,
} from "class-validator";
import { UserRole } from "../entities/usuario.entity";
import { EstadoOT } from "../../ots/entities/orden-trabajo.entity";

export class CreateUserDto {
  @ApiProperty()
  @IsString()
  @IsNotEmpty()
  username: string;

  @ApiProperty()
  @IsString()
  @IsNotEmpty()
  nombre: string;

  // Obligatorio (antes opcional): es la unica forma de crear la Identidad de
  // plataforma que la nueva autenticacion multi-tenant necesita para dejar
  // entrar a este usuario — sin email no hay con que engancharlo a un
  // acceso. Encontrado en produccion: usuarios creados desde el panel de
  // Usuarios del tenant sin este campo quedaban en taller_usuarios pero
  // jamas podian loguearse (ver AuthService.createUser).
  @ApiProperty()
  @IsEmail()
  @IsNotEmpty()
  email: string;

  @ApiProperty({ minLength: 4 })
  @IsString()
  @MinLength(4)
  password: string;

  @ApiProperty({ enum: UserRole })
  @IsEnum(UserRole)
  rol: UserRole;

  @ApiPropertyOptional({
    description: "Mapa de permisos por modulo: none|read|write",
  })
  @IsOptional()
  @IsObject()
  permisos?: Record<string, "none" | "read" | "write">;

  @ApiPropertyOptional({ description: "Tienda asignada al usuario" })
  @IsOptional()
  @IsInt()
  @Min(1)
  tiendaId?: number;

  @ApiPropertyOptional({
    description:
      "Tiendas permitidas para facturación POS (configuracion.facturacion). null/ausente = sin restricción, ve todas las que su permiso ya le dé.",
    type: [Number],
  })
  @IsOptional()
  @IsArray()
  @ArrayUnique()
  @IsInt({ each: true })
  facturacionPosTiendaIds?: number[] | null;

  @ApiPropertyOptional({
    description: "Estados de OT visibles para este usuario. null/ausente = ve todos.",
    enum: EstadoOT,
    isArray: true,
  })
  @IsOptional()
  @IsArray()
  @ArrayUnique()
  @IsEnum(EstadoOT, { each: true })
  estadosVisibles?: EstadoOT[] | null;
}
