import vine from '@vinejs/vine'
import { IntlCouriers, IntlCouriersRateType } from '../../types/enum.js'
import { normalizeArray } from '../Helper/Helper.js'

export const calculateIntlShippingRateValidator = vine.compile(
  vine.object({
    rate: vine.number(),
    courier: vine.number().min(1).max(4),
    customer_id: vine.number(),
    weight: vine.number(),
  })
)

export const listIntlRateGroupValidator = vine.compile(
  vine.object({
    page: vine.number().min(1).optional(),
    limit: vine.number().min(1).optional(),
    filter_by_is_active: vine.any().transform(normalizeArray).optional(),
    search: vine.string().optional(),
    sort_by_is_active: vine.enum(['asc', 'desc']).optional(),
    sort_by_name: vine.enum(['asc', 'desc']).optional(),
    sort_by_created_at: vine.enum(['asc', 'desc']).optional(),
    sort_by_updated_at: vine.enum(['asc', 'desc']).optional(),
    sort_by_id: vine.enum(['asc', 'desc']).optional(),
    sort_by_price_id: vine.enum(['asc', 'desc']).optional(),
  })
)

export const listAllIntlRateGroupsValidator = vine.compile(
  vine.object({
    search: vine.string().maxLength(50).optional(),
  })
)

export const intlRateGroupDetailsValidator = vine.compile(
  vine.object({
    id: vine.number().min(1),
  })
)

export const createIntlRateGroupValidator = vine.compile(
  vine.object({
    name: vine.string(),
    description: vine.string().minLength(1).maxLength(255).optional(),
  })
)

export const updateIntlRateGroupValidator = vine.compile(
  vine.object({
    id: vine.number().min(1),
    name: vine.string(),
    description: vine.string().minLength(1).maxLength(255).nullable().optional(),
  })
)

export const deleteIntlRateGroupValidator = vine.compile(
  vine.object({
    id: vine.number().min(1),
  })
)

export const statusUpdateIntlRateGroupValidator = vine.compile(
  vine.object({
    id: vine.number().min(1),
    is_active: vine.boolean(),
  })
)

export const listIntlCourierRateValidator = vine.compile(
  vine.object({
    page: vine.number().min(1).optional(),
    limit: vine.number().min(1).optional(),
    filter_by_intl_courier_rate_group_id: vine.number().min(1),
    filter_by_courier: vine.any().transform(normalizeArray).optional(),
    filter_by_rate_type: vine.any().transform(normalizeArray).optional(),
  })
)
export const intlCourierRateIndividualDetailsValidator = vine.compile(
  vine.object({
    courier_id: vine
      .number()
      .in(Object.values(IntlCouriers).filter((value) => typeof value === 'number')),
    intl_courier_rate_group_id: vine.number().min(1),
  })
)

export const createIntlCourierRateValidator = vine.compile(
  vine.object({
    intl_courier_rate_group_id: vine.number().min(1),
    courier: vine
      .number()
      .in(Object.values(IntlCouriers).filter((value) => typeof value === 'number')),
    weight_from: vine.number().min(0),
    weight_to: vine.number().min(0),
    rate_type: vine
      .number()
      .in(Object.values(IntlCouriersRateType).filter((value) => typeof value === 'number')),
    value: vine.number().min(0),
  })
)

export const updateIntlCourierRateValidator = vine.compile(
  vine.object({
    id: vine.number().min(1),
    intl_courier_rate_group_id: vine.number().min(1),
    courier: vine
      .number()
      .in(Object.values(IntlCouriers).filter((value) => typeof value === 'number')),
    weight_from: vine.number().min(0),
    weight_to: vine.number().min(0),
    rate_type: vine
      .number()
      .in(Object.values(IntlCouriersRateType).filter((value) => typeof value === 'number')),
    value: vine.number().min(0),
  })
)

export const deleteIntlCourierRateValidator = vine.compile(
  vine.object({
    id: vine.number().min(1),
  })
)
