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

export class CreatePayrollEntryDto {
  @ApiProperty({
    description: "Payroll Cycle ID",
    example: 1,
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "payroll_cycle_id",
    }),
  })
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "payroll_cycle_id",
      ":type": "integer",
    }),
  })
  payroll_cycle_id: number

  @ApiProperty({
    description: "Employee ID",
    example: 1,
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "employee_id",
    }),
  })
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "employee_id",
      ":type": "integer",
    }),
  })
  employee_id: number

  @ApiProperty({
    description: "Working Days in Month",
    example: 22,
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "working_days",
    }),
  })
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "working_days",
      ":type": "integer",
    }),
  })
  @Min(1, {
    message: validationMessage(messageKey.field_min_validation_error, {
      ":field": "working_days",
      ":min": "1",
    }),
  })
  working_days: number

  @ApiProperty({
    description: "Present Days",
    example: 20,
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "present_days",
    }),
  })
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "present_days",
      ":type": "integer",
    }),
  })
  @Min(0, {
    message: validationMessage(messageKey.field_min_validation_error, {
      ":field": "present_days",
      ":min": "0",
    }),
  })
  present_days: number

  @ApiProperty({
    description: "Paid Leaves",
    example: 2,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "paid_leaves",
      ":type": "integer",
    }),
  })
  @Min(0, {
    message: validationMessage(messageKey.field_min_validation_error, {
      ":field": "paid_leaves",
      ":min": "0",
    }),
  })
  paid_leaves?: number

  @ApiProperty({
    description: "Unpaid Leaves",
    example: 0,
    required: false,
  })
  @IsOptional()
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "unpaid_leaves",
      ":type": "integer",
    }),
  })
  @Min(0, {
    message: validationMessage(messageKey.field_min_validation_error, {
      ":field": "unpaid_leaves",
      ":min": "0",
    }),
  })
  unpaid_leaves?: number

  @ApiProperty({
    description: "Total Earnings",
    example: 90000.0,
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "total_earnings",
    }),
  })
  @IsNumber(
    { maxDecimalPlaces: 2 },
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "total_earnings",
        ":type": "number",
      }),
    },
  )
  @Min(0, {
    message: validationMessage(messageKey.field_min_validation_error, {
      ":field": "total_earnings",
      ":min": "0",
    }),
  })
  total_earnings: number

  @ApiProperty({
    description: "Total Deductions",
    example: 6275.0,
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "total_deductions",
    }),
  })
  @IsNumber(
    { maxDecimalPlaces: 2 },
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "total_deductions",
        ":type": "number",
      }),
    },
  )
  @Min(0, {
    message: validationMessage(messageKey.field_min_validation_error, {
      ":field": "total_deductions",
      ":min": "0",
    }),
  })
  total_deductions: number

  @ApiProperty({
    description: "Net Payable Amount",
    example: 83725.0,
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "net_payable",
    }),
  })
  @IsNumber(
    { maxDecimalPlaces: 2 },
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "net_payable",
        ":type": "number",
      }),
    },
  )
  @Min(0, {
    message: validationMessage(messageKey.field_min_validation_error, {
      ":field": "net_payable",
      ":min": "0",
    }),
  })
  net_payable: number
}
