import { Transform, Type } from 'class-transformer';
import {
  IsBoolean,
  IsDate,
  IsIn,
  IsInt,
  IsOptional,
  IsString,
  IsUUID,
  Max,
  MaxLength,
  Min,
  ValidateIf,
} from 'class-validator';

const RESULTADOS = ['RESUELTO', 'RESUELTO_AUTOSERVICIO', 'NO_RESUELTO', 'SIN_CONSULTA', 'ABANDONADO'] as const;
const MOTIVOS = [
  'trabado_sifen',
  'falla_sifen_persistente',
  'sync_empresa_hub',
  'no_encontrado',
  'sin_permiso',
  'consulta_sin_respuesta_en_guias',
  'posible_error_sistema',
  'cliente_disconforme',
  'fuera_de_alcance',
] as const;

export class RangoQuery {
  /** Default: últimos 30 días. */
  @IsOptional()
  @Type(() => Date)
  @IsDate()
  desde?: Date;

  @IsOptional()
  @Type(() => Date)
  @IsDate()
  hasta?: Date;
}

export class TicketsReporteQuery extends RangoQuery {
  @IsOptional()
  @IsIn(RESULTADOS)
  resultado?: string;

  @IsOptional()
  @IsIn(MOTIVOS)
  motivo?: string;

  @IsOptional()
  @IsUUID()
  empresa_id?: string;

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  @Max(1000)
  pagina?: number;
}

export class TicketIdParams {
  @IsUUID()
  id!: string;
}

export class AdjuntoReporteParams extends TicketIdParams {
  @IsUUID()
  adjunto!: string;
}

export class MensajeParams extends TicketIdParams {
  @Type(() => Number)
  @IsInt()
  @Min(1)
  orden!: number;
}

export class EtiquetaDto {
  /** true / false, o null para quitar la etiqueta. */
  @Transform(({ value }) => (value === null ? null : value))
  @ValidateIf((_, v) => v !== null)
  @IsBoolean()
  correcta!: boolean | null;
}

export class GuardarConfigDto {
  @IsIn([
    'ia_activa',
    'tope_tokens_diarios',
    'youtrack_activo',
    'modelo_redactor',
    'modelo_extractor',
    'modelo_consultor',
    'modelo_manual',
    'modelo_capturas',
    'telefono_contacto',
  ])
  clave!: string;

  /** null o ausente = ámbito global. */
  @IsOptional()
  @IsUUID()
  empresa_id?: string | null;

  /** null = borrar la fila (vuelve a heredar / al valor por defecto). */
  @IsOptional()
  @IsString()
  @MaxLength(60)
  valor?: string | null;
}
