import { ApiProperty, ApiPropertyOptional, OmitType, PartialType } from '@nestjs/swagger';
import { inm_proyecto_estado, inm_proyecto_tipo, inm_titular_tipo } from '@prisma/client';
import {
  IsBoolean,
  IsDateString,
  IsEnum,
  IsNotEmpty,
  IsOptional,
  IsString,
  IsUUID,
  Matches,
  MaxLength,
} from 'class-validator';

export class CreateProyectoDto {
  @ApiProperty({
    example: 'TORRE-SOL',
    description: 'Código corto y único en la empresa. No se puede cambiar después.',
  })
  @IsString()
  @Matches(/^[A-Za-z0-9_-]{2,16}$/, {
    message: 'El código va de 2 a 16 letras, números, guion o guion bajo. Ej: TORRE-SOL',
  })
  codigo: string;

  @ApiProperty({ example: 'Torre Sol — Villa Morra' })
  @IsString()
  @IsNotEmpty()
  @MaxLength(150)
  nombre: string;

  @ApiProperty({ enum: inm_proyecto_tipo, example: inm_proyecto_tipo.EDIFICIO })
  @IsEnum(inm_proyecto_tipo)
  tipo: inm_proyecto_tipo;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  @MaxLength(5000)
  descripcion?: string;

  @ApiPropertyOptional({ example: 'Av. Mcal. López 1234' })
  @IsOptional()
  @IsString()
  @MaxLength(255)
  direccion?: string;

  @ApiPropertyOptional({ example: 'Asunción' })
  @IsOptional()
  @IsString()
  @MaxLength(100)
  ciudad?: string;

  @ApiPropertyOptional({ enum: inm_titular_tipo, example: inm_titular_tipo.PROPIO })
  @IsOptional()
  @IsEnum(inm_titular_tipo)
  titular_tipo?: inm_titular_tipo;

  @ApiPropertyOptional({
    example: 'Fiduciaria Ejemplo S.A.',
    description: 'Obligatorio si el titular es un fideicomiso.',
  })
  @IsOptional()
  @IsString()
  @MaxLength(150)
  fiduciaria_nombre?: string;

  @ApiPropertyOptional({ example: '80000000-1' })
  @IsOptional()
  @IsString()
  @MaxLength(20)
  fiduciaria_ruc?: string;

  @ApiPropertyOptional({ description: 'Si no se indica, se crea uno con el código del proyecto.' })
  @IsOptional()
  @IsUUID()
  centro_costo_id?: string;

  @ApiPropertyOptional({ description: 'Cuenta de Tesorería donde se cobra este proyecto.' })
  @IsOptional()
  @IsUUID()
  cuenta_bancaria_id?: string;

  @ApiPropertyOptional({ description: 'Moneda de la lista de precios. Por defecto, guaraníes.' })
  @IsOptional()
  @IsUUID()
  moneda_id?: string;

  @ApiPropertyOptional({ example: '2026-11-01' })
  @IsOptional()
  @IsDateString()
  fecha_inicio?: string;

  @ApiPropertyOptional({ example: '2028-06-30' })
  @IsOptional()
  @IsDateString()
  fecha_entrega_estimada?: string;

  @ApiPropertyOptional({ enum: inm_proyecto_estado, example: inm_proyecto_estado.PLANIFICACION })
  @IsOptional()
  @IsEnum(inm_proyecto_estado)
  estado?: inm_proyecto_estado;
}

export class UpdateProyectoDto extends PartialType(OmitType(CreateProyectoDto, ['codigo'] as const)) {
  @ApiPropertyOptional({ description: 'Baja lógica: el proyecto nunca se borra.' })
  @IsOptional()
  @IsBoolean()
  activo?: boolean;
}
