import { ApiProperty } from "@nestjs/swagger"
import {
  IsNotEmpty,
  IsOptional,
  IsInt,
  IsString,
  IsNumber,
  IsEnum,
  IsDateString,
  Min,
  Max,
} from "class-validator"
import { validationMessage } from "../../../utils/helpers"
import { messageKey } from "../../../constants/message-keys"

export class CreateProjectDto {
  @ApiProperty({
    description: "Client ID",
    example: 1,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "client_id",
      ":type": "integer",
    }),
  })
  client_id?: number

  @ApiProperty({
    description: "Project Name",
    example: "Website Development",
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "name",
    }),
  })
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "name",
      ":type": "string",
    }),
  })
  name: string

  @ApiProperty({
    description: "Project Budget",
    example: 50000.0,
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "budget",
    }),
  })
  @IsNumber(
    { maxDecimalPlaces: 2 },
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "budget",
        ":type": "number",
      }),
    },
  )
  @Min(0, {
    message: validationMessage(messageKey.field_min_validation_error, {
      ":field": "budget",
      ":min": "0",
    }),
  })
  budget: number

  @ApiProperty({
    description: "Project Status",
    example: "Planning",
    enum: ["Planning", "In Progress"],
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "status",
    }),
  })
  @IsEnum(
    [
      "Planning",
      "In Progress",
      "Completed",
      "On Hold",
      "Cancelled",
      "Planning",
      "Completed",
    ],
    {
      message: validationMessage(messageKey.field_enum_validation_error, {
        ":field": "status",
        ":values":
          "Planning, In Progress, Completed, On Hold, Cancelled, Planning, Completed",
      }),
    },
  )
  status: string

  @ApiProperty({
    description: "Project Address",
    example: "123 Main Street, City, State",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "address",
      ":type": "string",
    }),
  })
  address?: string

  @ApiProperty({
    description: "Project Description",
    example: "Complete website development with modern UI/UX",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "description",
      ":type": "string",
    }),
  })
  description?: string

  @ApiProperty({
    description: "Project Threshold Percentage",
    example: 15.0,
    required: false,
  })
  @IsOptional()
  @IsNumber(
    { maxDecimalPlaces: 2 },
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "threshold_percentage",
        ":type": "number",
      }),
    },
  )
  @Min(0, {
    message: validationMessage(messageKey.field_min_validation_error, {
      ":field": "threshold_percentage",
      ":min": "0",
    }),
  })
  @Max(100, {
    message: validationMessage(messageKey.field_max_validation_error, {
      ":field": "threshold_percentage",
      ":max": "100",
    }),
  })
  threshold_percentage?: number

  @ApiProperty({
    description: "Project Start Date",
    example: "2024-01-01",
    required: false,
  })
  @IsOptional()
  @IsDateString(
    {},
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "start_date",
        ":type": "date string (YYYY-MM-DD)",
      }),
    },
  )
  start_date?: string

  @ApiProperty({
    description: "Project End Date",
    example: "2024-12-31",
    required: false,
  })
  @IsOptional()
  @IsDateString(
    {},
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "end_date",
        ":type": "date string (YYYY-MM-DD)",
      }),
    },
  )
  end_date?: string

  @ApiProperty({
    description: "Project Manager Employee ID",
    example: 1,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "managed_by",
      ":type": "integer",
    }),
  })
  managed_by?: number
}
