import { RentalStatus } from "@prisma/client";
import { Type } from "class-transformer";
import {
  ArrayMinSize,
  IsArray,
  IsDateString,
  IsEnum,
  IsInt,
  IsNumber,
  IsOptional,
  IsString,
  Min,
  ValidateNested,
} from "class-validator";

export class CreateRentalItemDto {
  @IsString()
  equipmentId!: string;

  @IsInt()
  @Min(1)
  quantity!: number;

  @IsNumber()
  @Min(0)
  dailyRate!: number;
}

export class CreateRentalInstallmentDto {
  @IsDateString()
  dueDate!: string;

  @IsNumber()
  @Min(0)
  amount!: number;
}

export class CreateRentalDto {
  @IsString()
  customerId!: string;

  @IsDateString()
  startDate!: string;

  @IsDateString()
  endDate!: string;

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

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

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

  @IsOptional()
  @IsInt()
  @Min(1)
  installmentsCount?: number;

  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => CreateRentalInstallmentDto)
  installments?: CreateRentalInstallmentDto[];

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

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

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

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

  @IsArray()
  @ArrayMinSize(1, { message: "O contrato deve possuir pelo menos 1 equipamento." })
  @ValidateNested({ each: true })
  @Type(() => CreateRentalItemDto)
  items!: CreateRentalItemDto[];
}
