import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger';
import { inm_observacion_estado, inm_tarea_estado } from '@prisma/client';
import { Type } from 'class-transformer';
import {
  ArrayMaxSize,
  IsArray,
  IsBoolean,
  IsDateString,
  IsEnum,
  IsInt,
  IsNotEmpty,
  IsNumber,
  IsOptional,
  IsString,
  MaxLength,
  Min,
  ValidateNested,
} from 'class-validator';

export class EscrituraDto {
  @ApiPropertyOptional({ example: 'Escribanía Pérez' }) @IsOptional() @IsString() @MaxLength(150) escribania?:
    | string
    | null;
  @ApiPropertyOptional({ example: 'Esc. Ana Pérez' }) @IsOptional() @IsString() @MaxLength(150) escribano?:
    | string
    | null;
  @ApiPropertyOptional({ example: '0981 000 000 · ana@escribania.com.py' })
  @IsOptional()
  @IsString()
  @MaxLength(150)
  contacto?: string | null;
  @ApiPropertyOptional({ example: '2028-08-15' }) @IsOptional() @IsDateString() fecha_prevista?: string | null;
  @ApiPropertyOptional() @IsOptional() @IsBoolean() hipoteca?: boolean;
  @ApiPropertyOptional({ example: 40000 }) @IsOptional() @IsNumber({ maxDecimalPlaces: 2 }) @Min(0) hipoteca_monto?:
    | number
    | null;
  @ApiPropertyOptional({ example: 'Banco X' }) @IsOptional() @IsString() @MaxLength(150) hipoteca_acreedor?:
    | string
    | null;
  @ApiPropertyOptional() @IsOptional() @IsString() @MaxLength(5000) notas?: string | null;
}

export class FirmarEscrituraDto {
  @ApiProperty({ example: '2028-08-15' }) @IsDateString() fecha_firma: string;
  @ApiPropertyOptional({ example: '1234' }) @IsOptional() @IsString() @MaxLength(50) numero_escritura?: string;
}

export class InscribirEscrituraDto {
  @ApiProperty({ example: '2028-09-30' }) @IsDateString() fecha_inscripcion: string;
}

export class TareaDto {
  @ApiProperty({ example: 'Certificado de no adeudar impuesto inmobiliario' })
  @IsString()
  @IsNotEmpty()
  @MaxLength(200)
  nombre: string;
  @ApiPropertyOptional() @IsOptional() @IsInt() @Min(0) orden?: number;
  @ApiPropertyOptional({ enum: inm_tarea_estado }) @IsOptional() @IsEnum(inm_tarea_estado) estado?: inm_tarea_estado;
  @ApiPropertyOptional() @IsOptional() @IsDateString() fecha?: string | null;
  @ApiPropertyOptional() @IsOptional() @IsString() @MaxLength(150) responsable?: string | null;
  @ApiPropertyOptional() @IsOptional() @IsString() @MaxLength(500) notas?: string | null;
}

export class UpdateTareaDto extends PartialType(TareaDto) {}

export class ObservacionDto {
  @ApiProperty({ example: 'Mancha de humedad en el baño principal' })
  @IsString()
  @IsNotEmpty()
  @MaxLength(500)
  descripcion: string;
  @ApiPropertyOptional({ example: 'Sanitaria' }) @IsOptional() @IsString() @MaxLength(80) rubro?: string | null;
  @ApiPropertyOptional({ example: 'Contratista de sanitaria' }) @IsOptional() @IsString() @MaxLength(150) responsable?:
    | string
    | null;
  @ApiPropertyOptional() @IsOptional() @IsString() @MaxLength(500) notas?: string | null;
}

export class UpdateObservacionDto extends PartialType(ObservacionDto) {
  @ApiPropertyOptional({ enum: inm_observacion_estado })
  @IsOptional()
  @IsEnum(inm_observacion_estado)
  estado?: inm_observacion_estado;
  @ApiPropertyOptional() @IsOptional() @IsDateString() fecha_resuelta?: string | null;
}

export class EntregaDto {
  @ApiProperty({ example: '2029-06-30' }) @IsDateString() fecha: string;
  @ApiProperty({ example: 'María Benítez (titular)' }) @IsString() @IsNotEmpty() @MaxLength(150) recibido_por: string;
  @ApiPropertyOptional({ default: false }) @IsOptional() @IsBoolean() acta_firmada?: boolean;
  @ApiPropertyOptional() @IsOptional() @IsString() @MaxLength(5000) notas?: string | null;

  @ApiPropertyOptional({
    type: [ObservacionDto],
    description: 'Observaciones del acta (lo que el comprador marcó al recibir)',
  })
  @IsOptional()
  @IsArray()
  @ArrayMaxSize(100)
  @ValidateNested({ each: true })
  @Type(() => ObservacionDto)
  observaciones?: ObservacionDto[];
}

export class UpdateEntregaDto {
  @ApiPropertyOptional() @IsOptional() @IsBoolean() acta_firmada?: boolean;
  @ApiPropertyOptional() @IsOptional() @IsString() @MaxLength(150) recibido_por?: string;
  @ApiPropertyOptional() @IsOptional() @IsString() @MaxLength(5000) notas?: string | null;
}
