import { ApiProperty } from "@nestjs/swagger"
import {
  IsNotEmpty,
  IsOptional,
  IsString,
  IsEmail,
  IsDateString,
  IsNumber,
  IsEnum,
  IsInt,
} from "class-validator"
import { validationMessage } from "../../../utils/helpers"
import { messageKey } from "../../../constants/message-keys"
import { DurationType } from "../entities/company-subscription.entity"

export class CreateCompanyDto {
  @ApiProperty({
    description: "Company Name",
    example: "Acme Corporation",
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "company_name",
    }),
  })
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "company_name",
      ":type": "string",
    }),
  })
  company_name: string

  @ApiProperty({
    description: "Admin First Name",
    example: "John",
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "first_name",
    }),
  })
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "first_name",
      ":type": "string",
    }),
  })
  first_name: string

  @ApiProperty({
    description: "Admin Last Name",
    example: "Doe",
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "last_name",
    }),
  })
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "last_name",
      ":type": "string",
    }),
  })
  last_name: string

  @ApiProperty({
    description: "Admin Email Address",
    example: "admin@acme.com",
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "email",
    }),
  })
  @IsEmail(
    {},
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "email",
        ":type": "valid email",
      }),
    },
  )
  email: string

  @ApiProperty({
    description: "Admin Phone Number",
    example: "+1234567890",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "phone_number",
      ":type": "string",
    }),
  })
  phone_number?: string

  @ApiProperty({
    description: "Subscription Start Date",
    example: "2024-01-01",
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "subscription_start_date",
    }),
  })
  @IsDateString(
    {},
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "subscription_start_date",
        ":type": "date string (YYYY-MM-DD)",
      }),
    },
  )
  subscription_start_date: string

  @ApiProperty({
    description: "Subscription Duration",
    example: 12,
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "subscription_duration",
    }),
  })
  @IsInt({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "subscription_duration",
      ":type": "integer",
    }),
  })
  subscription_duration: number

  @ApiProperty({
    description: "Subscription Duration Type",
    example: "Months",
    enum: DurationType,
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "subscription_duration_type",
    }),
  })
  @IsEnum(DurationType, {
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "subscription_duration_type",
      ":type": "Months or Years or Days",
    }),
  })
  subscription_duration_type: DurationType

  @ApiProperty({
    description: "Subscription Amount",
    example: 999.99,
  })
  @IsNotEmpty({
    message: validationMessage(messageKey.field_required, {
      ":field": "subscription_amount",
    }),
  })
  @IsNumber(
    {},
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "subscription_amount",
        ":type": "number",
      }),
    },
  )
  subscription_amount: number

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

  @ApiProperty({
    description: "Latitude coordinate",
    example: "40.7128",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "lat",
      ":type": "string",
    }),
  })
  lat?: string

  @ApiProperty({
    description: "Longitude coordinate",
    example: "-74.0060",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "long",
      ":type": "string",
    }),
  })
  long?: string

  @ApiProperty({
    description: "Country Code",
    example: "1",
    required: false,
  })
  @IsOptional()
  @IsNumber(
    {},
    {
      message: validationMessage(messageKey.field_type_validation_error, {
        ":field": "country_code",
        ":type": "number",
      }),
    },
  )
  country_code?: number

  @ApiProperty({
    description: "Currency",
    example: "$",
    required: false,
  })
  @IsOptional()
  @IsString({
    message: validationMessage(messageKey.field_type_validation_error, {
      ":field": "currency",
      ":type": "string",
    }),
  })
  currency: string
}
