/**
 * Proposal DTOs - Data Transfer Objects para Propuestas Enviadas
 *
 * Representa una propuesta enviada a una licitacion.
 *
 * @module Bidding (MAI-018)
 */

import {
  IsString,
  IsUUID,
  IsOptional,
  IsEnum,
  IsNumber,
  IsDateString,
  MaxLength,
  Min,
  Max,
  MinLength,
} from 'class-validator';

/**
 * Estado de la propuesta
 */
export enum ProposalStatus {
  RECEIVED = 'received',
  EVALUATING = 'evaluating',
  QUALIFIED = 'qualified',
  DISQUALIFIED = 'disqualified',
  WINNER = 'winner',
}

/**
 * DTO para crear una nueva propuesta
 */
export class CreateProposalDto {
  @IsUUID()
  tenderId: string;

  @IsUUID()
  vendorId: string;

  @IsNumber()
  @Min(0)
  proposedAmount: number;

  @IsNumber()
  @Min(1)
  proposedScheduleDays: number;

  @IsOptional()
  @IsString()
  @MaxLength(500)
  technicalProposalUrl?: string;

  @IsOptional()
  @IsString()
  @MaxLength(500)
  economicProposalUrl?: string;

  @IsOptional()
  @IsDateString()
  submittedAt?: string;
}

/**
 * DTO para actualizar una propuesta existente
 */
export class UpdateProposalDto {
  @IsOptional()
  @IsNumber()
  @Min(0)
  proposedAmount?: number;

  @IsOptional()
  @IsNumber()
  @Min(1)
  proposedScheduleDays?: number;

  @IsOptional()
  @IsString()
  @MaxLength(500)
  technicalProposalUrl?: string;

  @IsOptional()
  @IsString()
  @MaxLength(500)
  economicProposalUrl?: string;
}

/**
 * DTO para evaluar una propuesta (asignar puntajes)
 */
export class EvaluateProposalDto {
  @IsNumber()
  @Min(0)
  @Max(100)
  technicalScore: number;

  @IsNumber()
  @Min(0)
  @Max(100)
  economicScore: number;
}

/**
 * DTO para descalificar una propuesta
 */
export class DisqualifyProposalDto {
  @IsString()
  @MinLength(10)
  reason: string;
}

/**
 * DTO para filtrar propuestas en listados
 */
export class ProposalFiltersDto {
  @IsOptional()
  @IsUUID()
  tenderId?: string;

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

  @IsOptional()
  @IsEnum(ProposalStatus)
  status?: ProposalStatus;

  @IsOptional()
  @IsDateString()
  submittedFrom?: string;

  @IsOptional()
  @IsDateString()
  submittedTo?: string;

  @IsOptional()
  @IsNumber()
  @Min(0)
  minAmount?: number;

  @IsOptional()
  @IsNumber()
  @Min(0)
  maxAmount?: number;

  @IsOptional()
  @IsString()
  search?: string;

  @IsOptional()
  @IsNumber()
  @Min(1)
  page?: number;

  @IsOptional()
  @IsNumber()
  @Min(1)
  limit?: number;

  @IsOptional()
  @IsString()
  sortBy?: string;

  @IsOptional()
  @IsEnum(['ASC', 'DESC'])
  sortOrder?: 'ASC' | 'DESC';
}

/**
 * DTO de respuesta para una propuesta
 */
export class ProposalResponseDto {
  id: string;
  tenantId: string;
  tenderId: string;
  tender?: {
    id: string;
    number: string;
    title: string;
    referenceAmount?: string;
  };
  vendorId: string;
  vendor?: {
    id: string;
    code: string;
    businessName: string;
    rating?: number;
  };
  proposedAmount: string;
  proposedScheduleDays: number;
  technicalProposalUrl?: string;
  economicProposalUrl?: string;
  technicalScore?: number;
  economicScore?: number;
  totalScore?: number;
  status: ProposalStatus;
  submittedAt: Date;
  createdAt: Date;
  createdById?: string;
  createdBy?: {
    id: string;
    firstName: string;
    lastName: string;
  };
  updatedAt: Date;
  updatedById?: string;
}
