import vine from '@vinejs/vine'
import { convertDateToDateTime, sanitizeIdOrEncryptedId } from '../Helper/Helper.js'
import { DeliveryPickupSlotType, ShippingCarrier } from '../../types/enum.js'

export const initiateInternationalDraftOrderByAdminValidator = vine.compile(
  vine.object({
    draft_order_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    created_for_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    recipient_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    package_details: vine.array(
      vine.object({
        package_type_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
        weight: vine.number().min(0).max(10000).optional(),
        length: vine.number().min(0.1).max(1000).optional(),
        width: vine.number().min(0.1).max(1000).optional(),
        height: vine.number().min(0.1).max(1000).optional(),
        package_description: vine.string().maxLength(255).optional(),
        customer_input_package_value: vine.number().min(1).max(100000000).optional(),
      })
    ),
    customer_input_order_id: vine.string().optional(),
    pickup_customer_name: vine.string().maxLength(50).optional(),
    pickup_mobile_number: vine.string().maxLength(14).optional(),
    pickup_alternate_number: vine.string().maxLength(14).optional(),
    delivery_instructions: vine.string().maxLength(255).optional(),
    destination_customer_name: vine.string().maxLength(50).optional(),
    destination_mobile_number: vine.string().maxLength(14).optional(),
    destination_alternate_number: vine.string().maxLength(14).optional(),
    pickup_date: vine.date().afterOrEqual('today').transform(convertDateToDateTime).optional(),
    pickup_slot_type: vine
      .number()
      .in(Object.values(DeliveryPickupSlotType).filter((value) => typeof value === 'number'))
      .optional(),
    pickup_address_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    ref_order_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),

    shipper_company_name: vine.string().maxLength(100).optional(),
    shipper_name: vine.string().maxLength(100).optional(),
    shipper_address: vine.string().maxLength(255).optional(),
    shipper_city: vine.string().maxLength(100).optional(),
    shipper_city_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    shipper_postal_code: vine.string().maxLength(20).optional(),
    shipper_country: vine.string().maxLength(50).optional(),
    shipper_country_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    shipper_email: vine.string().email().optional(),
    shipper_tax_no: vine.string().optional(),

    recipient_company_name: vine.string().maxLength(100).optional(),
    recipient_name: vine.string().maxLength(100).optional(),
    recipient_address: vine.string().maxLength(255).optional(),
    recipient_city: vine.string().maxLength(100).optional(),
    recipient_city_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    recipient_postal_code: vine.string().maxLength(20).optional(),
    recipient_country: vine.string().maxLength(50).optional(),
    recipient_country_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    recipient_email: vine.string().email().optional(),
    recipient_tax_no: vine.string().optional(),
    service_code: vine.string().optional(),
    description: vine.string().maxLength(255).optional(),
    product_group: vine.string().maxLength(50).optional(),
    product_type: vine.string().maxLength(50).optional(),
    payment_type: vine.string().maxLength(50).optional(),
    customs_value: vine.number().optional(),
    currency: vine.string().maxLength(3).optional(),
    carrier: vine.enum(ShippingCarrier).optional(),
    is_cod: vine.boolean().optional(),
    cod_amount: vine.number().optional().requiredWhen('is_cod', '=', true),
  })
)
export const initiateInternationalDraftOrderByCustomerValidator = vine.compile(
  vine.object({
    draft_order_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    created_for_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    package_details: vine.array(
      vine.object({
        package_type_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
        weight: vine.number().min(0).max(10000).optional(),
        length: vine.number().min(0.1).max(1000).optional(),
        width: vine.number().min(0.1).max(1000).optional(),
        height: vine.number().min(0.1).max(1000).optional(),
        package_description: vine.string().maxLength(255).optional(),
        customer_input_package_value: vine.number().min(1).max(100000000).optional(),
      })
    ),
    customer_input_order_id: vine.string().optional(),
    pickup_customer_name: vine.string().maxLength(50).optional(),
    pickup_mobile_number: vine.string().maxLength(14).optional(),
    pickup_alternate_number: vine.string().maxLength(14).optional(),
    delivery_instructions: vine.string().maxLength(255).optional(),
    destination_customer_name: vine.string().maxLength(50).optional(),
    destination_mobile_number: vine.string().maxLength(14).optional(),
    destination_alternate_number: vine.string().maxLength(14).optional(),
    pickup_date: vine.date().afterOrEqual('today').transform(convertDateToDateTime).optional(),
    pickup_slot_type: vine
      .number()
      .in(Object.values(DeliveryPickupSlotType).filter((value) => typeof value === 'number'))
      .optional(),
    pickup_address_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    ref_order_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),

    shipper_company_name: vine.string().maxLength(100).optional(),
    shipper_name: vine.string().maxLength(100).optional(),
    shipper_address: vine.string().maxLength(255).optional(),
    shipper_city: vine.string().maxLength(100).optional(),
    shipper_city_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    shipper_postal_code: vine.string().maxLength(20).optional(),
    shipper_country: vine.string().maxLength(50).optional(),
    shipper_country_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    shipper_email: vine.string().email().optional(),
    shipper_tax_no: vine.string().optional(),

    recipient_company_name: vine.string().maxLength(100).optional(),
    recipient_name: vine.string().maxLength(100).optional(),
    recipient_address: vine.string().maxLength(255).optional(),
    recipient_city: vine.string().maxLength(100).optional(),
    recipient_city_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    recipient_postal_code: vine.string().maxLength(20).optional(),
    recipient_country: vine.string().maxLength(50).optional(),
    recipient_country_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    recipient_email: vine.string().email().optional(),
    recipient_tax_no: vine.string().optional(),
    service_code: vine.string().optional(),
    description: vine.string().maxLength(255).optional(),
    product_group: vine.string().maxLength(50).optional(),
    product_type: vine.string().maxLength(50).optional(),
    payment_type: vine.string().maxLength(50).optional(),
    customs_value: vine.number().optional(),
    currency: vine.string().maxLength(3).optional(),
    carrier: vine.enum(ShippingCarrier).optional(),
    is_cod: vine.boolean().optional(),
    cod_amount: vine.number().optional().requiredWhen('is_cod', '=', true),
  })
)
export const editInternationalOrderValidator = vine.compile(
  vine.object({
    order_id: vine.any().transform(sanitizeIdOrEncryptedId),
    package_details: vine
      .array(
        vine.object({
          id: vine.number().optional(),
          package_type_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
          weight: vine.number().min(0).max(10000).optional(),
          length: vine.number().min(0.1).max(1000).optional(),
          width: vine.number().min(0.1).max(1000).optional(),
          height: vine.number().min(0.1).max(1000).optional(),
          package_description: vine.string().maxLength(255).optional(),
          customer_input_package_value: vine.number().min(0).max(100000000).optional(),
        })
      )
      .optional(),
    customer_input_order_id: vine.string().optional(),
    pickup_customer_name: vine.string().maxLength(50).optional(),
    pickup_mobile_number: vine.string().maxLength(14).optional(),
    pickup_alternate_number: vine.string().maxLength(14).optional(),
    delivery_instructions: vine.string().maxLength(255).optional(),
    destination_customer_name: vine.string().maxLength(50).optional(),
    destination_mobile_number: vine.string().maxLength(14).optional(),
    destination_alternate_number: vine.string().maxLength(14).optional(),
    pickup_date: vine.date().transform(convertDateToDateTime).optional(),
    pickup_slot_type: vine
      .number()
      .in(Object.values(DeliveryPickupSlotType).filter((value) => typeof value === 'number'))
      .optional(),
    delivery_date: vine.date().transform(convertDateToDateTime).optional(),
    pickup_address_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),

    // International Fields
    shipper_company_name: vine.string().maxLength(100).optional(),
    shipper_name: vine.string().maxLength(100).optional(),
    shipper_address: vine.string().maxLength(255).optional(),
    shipper_city: vine.string().maxLength(100).optional(),
    shipper_city_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    shipper_postal_code: vine.string().maxLength(20).optional(),
    shipper_country: vine.string().maxLength(50).optional(),
    shipper_country_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    shipper_email: vine.string().email().optional(),
    shipper_phone: vine.string().maxLength(14).optional(),
    shipper_tax_no: vine.string().optional(),

    recipient_company_name: vine.string().maxLength(100).optional(),
    recipient_name: vine.string().maxLength(100).optional(),
    recipient_address: vine.string().maxLength(255).optional(),
    recipient_city: vine.string().maxLength(100).optional(),
    recipient_city_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    recipient_postal_code: vine.string().maxLength(20).optional(),
    recipient_country: vine.string().maxLength(50).optional(),
    recipient_country_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
    recipient_email: vine.string().email().optional(),
    recipient_phone: vine.string().maxLength(14).optional(),
    recipient_tax_no: vine.string().optional(),
    service_code: vine.string().optional(),
    description: vine.string().maxLength(255).optional(),
    product_group: vine.string().maxLength(50).optional(),
    product_type: vine.string().maxLength(50).optional(),
    payment_type: vine.string().maxLength(50).optional(),
    customs_value: vine.number().optional(),
    currency: vine.string().maxLength(3).optional(),
    carrier: vine.enum(ShippingCarrier).optional(),
    tax_no: vine.string().optional(),
    is_cod: vine.boolean().optional(),
    cod_amount: vine.number().optional().requiredWhen('is_cod', '=', true),
    created_for_id: vine.any().transform(sanitizeIdOrEncryptedId).optional(),
  })
)

export const approveAndPlaceInternationalOrderByAdminValidator = vine.compile(
  vine.object({
    order_id: vine.any().transform(sanitizeIdOrEncryptedId),
    remarks: vine.string().maxLength(255).optional(),
  })
)
