/* eslint-disable @typescript-eslint/naming-convention */
import {
  approveAndPlaceInternationalOrderByAdminValidator,
  editInternationalOrderValidator,
  initiateInternationalDraftOrderByAdminValidator,
  initiateInternationalDraftOrderByCustomerValidator,
} from '#validators/international_order'
import type { HttpContext } from '@adonisjs/core/http'
import {
  CustomerTypeForOrder,
  DeliveryPickupSlotType,
  InvoicePaymentStatus,
  OrderCreatedByType,
  OrderFlowType,
  OrderHistoryActions,
  OrderStatus,
  OrderStatusForCustomer,
  OrderType,
  PackageStatus,
  PublicTrackStatus,
  ShippingCarrier,
  UserType,
  WarehouseStatus,
} from '../../types/enum.js'
import DraftOrder from '#models/draft_order'
import Customer from '#models/customer'
import { findCustomerType } from '../Helper/OrderHelper.js'
import {
  createComprehensiveOrderHistory,
  getBlockAssignedDrivers,
  normalizeRateResult,
  orderGeneratedIdById,
  resolveAddressDetails,
  sanitizeIdOrEncryptedId,
  selectRateByServiceCode,
  validateBahrainPostalCode,
} from '../Helper/Helper.js'
import Order from '#models/order'
import { generatePackageId } from '../Helper/IdGeneratorHelper.js'
import ExternalPackageId from '#models/external_package_id'
import Invoice from '#models/invoice'
import { DateTime } from 'luxon'
import InternationalOrder from '#models/international_order'
import logger from '@adonisjs/core/services/logger'
import ShippingFactory from '#services/shipping/shipping_factory'
import { calculateShippingChargeWithMarkup } from '../Helper/shipping_helper.js'
import InternationalCity from '#models/international_city'
import MasterDataCountry from '#models/master_data_country'
import PublicTrack from '#models/public_track'

export default class InternationalOrdersController {
  private async resolveCityAndCountryIds(
    cityName: string | null | undefined,
    cityId: number | null | undefined,
    countryName: string | null | undefined,
    countryId: number | null | undefined
  ) {
    let resolvedCityId = cityId
    let resolvedCountryId = countryId

    if (!resolvedCityId && cityName) {
      const city = await InternationalCity.query().where('name', cityName).first()
      if (city) {
        resolvedCityId = city.id
        if (!resolvedCountryId) {
          resolvedCountryId = city.countryId
        }
      }
    }

    if (!resolvedCountryId && countryName) {
      const country = await MasterDataCountry.query()
        .where('name', countryName)
        .orWhere('short_code', countryName)
        .first()
      if (country) {
        resolvedCountryId = Number(country.id)
      }
    }

    return { resolvedCityId, resolvedCountryId }
  }

  async createInternationalShipmentByAdmin({ auth, request, response }: HttpContext) {
    const { order_id } = request.all()

    if (!order_id) {
      return response.badRequest({
        status: false,
        message: 'Order ID is required',
      })
    }

    const order = await Order.query()
      .where('id', order_id)
      .preload('international_order_details', (q) => {
        q.preload('shipper_country_details')
        q.preload('shipper_city_details')
        q.preload('recipient_country_details')
        q.preload('recipient_city_details')
      })
      .preload('order_package_list')
      .firstOrFail()

    if (!order.international_order_details) {
      return response.badRequest({
        status: false,
        message: 'International order details not found',
      })
    }

    try {
      const carrier = order.international_order_details.carrier as ShippingCarrier
      const shippingProvider = ShippingFactory.getProvider(carrier)

      const shipmentResult = await shippingProvider.createShipment(
        order,
        order.international_order_details
      )

      order.status = OrderStatus.InTransit
      order.status_for_customer = OrderStatusForCustomer.InTransit
      await order.save()

      await order.related('international_order_details').query().update({
        courier_order_tracking_no: shipmentResult.trackingNumber,
        courier_order_barcode_url: shipmentResult.labelUrl,
      })

      // Update Order Packages with Tracking Info
      for (const pkg of order.order_package_list) {
        pkg.status = PackageStatus.InTransit
        await pkg.save()
      }

      await createComprehensiveOrderHistory(
        order.id,
        auth?.user?.id as number,
        OrderHistoryActions.InTransit,
        {},
        `✨ International Order #${order.generated_order_id} is now In Transit after shipment creation by ${auth?.user?.first_name} ${auth?.user?.last_name || ''}.`
      )

      await PublicTrack.create({
        order_id: order.id,
        status: PublicTrackStatus.InTransit,
        tracking_details: `✨ Your order is now In Transit.`,
      })

      return response.ok({
        status: true,
        message: 'Shipment created successfully',
        data: shipmentResult,
      })
    } catch (error) {
      logger.error(error, 'Failed to create shipment')
      return response.badRequest({
        status: false,
        message: 'Failed to create shipment: ' + error.message,
      })
    }
  }

  async initiateInternationalDraftOrderByAdmin({ auth, request, response }: HttpContext) {
    const userId = auth.user?.id

    let {
      draft_order_id: draftOrderId,
      created_for_id,
      package_details,
      pickup_customer_name,
      pickup_mobile_number,
      ref_order_id,
      recipient_id,
      carrier,
      pickup_address_id,
      ...payload
    } = await request.validateUsing(initiateInternationalDraftOrderByAdminValidator)

    let courier_rate = 0
    let margin = 0

    // Resolve country codes for validation
    let shipperCountryCode = payload.shipper_country
    let recipientCountryCode = payload.recipient_country

    if (shipperCountryCode) {
      const country = await MasterDataCountry.query()
        .where('name', shipperCountryCode)
        .orWhere('short_code', shipperCountryCode)
        .first()
      if (country) shipperCountryCode = country.short_code
    }

    if (recipientCountryCode) {
      const country = await MasterDataCountry.query()
        .where('name', recipientCountryCode)
        .orWhere('short_code', recipientCountryCode)
        .first()
      if (country) recipientCountryCode = country.short_code
    }

    // FedEx Postal Code Validation
    const fedex = ShippingFactory.getProvider(ShippingCarrier.FedEx) as any
    if (payload.shipper_postal_code && shipperCountryCode) {
      // const validation = await fedex.validatePostalCode(
      //   payload.shipper_postal_code,
      //   shipperCountryCode,
      //   payload.shipper_city
      // )
      // if (!validation.status) {
      //   return response.badRequest({
      //     status: false,
      //     message:
      //       validation.message ||
      //       `Invalid shipper postal code: ${payload.shipper_postal_code} for ${shipperCountryCode}`,
      //   })
      // }
      const validation = validateBahrainPostalCode(payload?.shipper_postal_code)
      if (!validation) {
        return response.badRequest({
          status: false,
          message: `Invalid shipper postal code: ${payload.shipper_postal_code} for ${payload.shipper_country ?? shipperCountryCode}`,
        })
      }
    }

    if (payload.recipient_postal_code && recipientCountryCode) {
      const validation = await fedex.validatePostalCode(
        payload.recipient_postal_code,
        recipientCountryCode,
        payload.recipient_city
      )
      if (!validation.status) {
        return response.badRequest({
          status: false,
          message:
            validation.message ||
            `Invalid recipient postal code: ${payload.recipient_postal_code} for ${recipientCountryCode}`,
        })
      }
    }

    created_for_id = created_for_id ?? 0
    package_details = package_details.map((pkg) => ({
      ...pkg,
      weight: pkg.weight ?? 0,
    }))

    let recipientDetails = null
    if (recipient_id) {
      recipientDetails = await Customer.query().where('id', recipient_id).firstOrFail()
    }
    const pickupAddressData = await resolveAddressDetails(pickup_address_id)

    const { resolvedCityId: recipientCityId, resolvedCountryId: recipientCountryId } =
      await this.resolveCityAndCountryIds(
        payload.recipient_city ?? recipientDetails?.city_details?.name,
        payload.recipient_city_id,
        payload.recipient_country ?? 'SA',
        payload.recipient_country_id
      )

    const recipientData = recipientDetails
      ? {
          recipient_company_name:
            payload.recipient_company_name ??
            recipientDetails.company_name ??
            `${recipientDetails.first_name} ${recipientDetails.last_name}`,

          recipient_name:
            payload.recipient_name ??
            `${recipientDetails.first_name} ${recipientDetails.last_name}`,

          recipient_address:
            payload.recipient_address ??
            recipientDetails.address_line_one ??
            recipientDetails.billing_address ??
            '',

          recipient_city: payload.recipient_city ?? recipientDetails.city_details?.name ?? '',

          recipient_city_id: recipientCityId,

          recipient_postal_code: payload.recipient_postal_code ?? '',

          recipient_country: payload.recipient_country ?? 'SA', // or derive if available

          recipient_country_id: recipientCountryId,

          recipient_email:
            payload.recipient_email ??
            recipientDetails.email ??
            recipientDetails.contact_email ??
            '',

          destination_customer_name:
            payload.destination_customer_name ??
            `${recipientDetails.first_name} ${recipientDetails.last_name}`,

          destination_mobile_number:
            payload.destination_mobile_number ?? recipientDetails.phone ?? '',

          destination_alternate_number:
            payload.destination_alternate_number ?? recipientDetails.alt_phone ?? '',
        }
      : {
          recipient_city_id: recipientCityId,
          recipient_country_id: recipientCountryId,
        }

    const createdById = created_for_id
    if (ref_order_id) ref_order_id = (ref_order_id as number) || 0
    const customerDetails: any = created_for_id
      ? await Customer.query().where('id', created_for_id).firstOrFail()
      : {}

    const { resolvedCityId: shipperCityId, resolvedCountryId: shipperCountryId } =
      await this.resolveCityAndCountryIds(
        payload.shipper_city ?? customerDetails.city_details?.name,
        payload.shipper_city_id,
        payload.shipper_country ?? 'Bahrain',
        payload.shipper_country_id
      )

    const shipperDetails = {
      shipper_company_name:
        payload.shipper_company_name ??
        customerDetails.company_name ??
        `${customerDetails.first_name} ${customerDetails.last_name}`,

      shipper_name:
        payload.shipper_name ?? `${customerDetails.first_name} ${customerDetails.last_name}`,

      shipper_address:
        payload.shipper_address ??
        customerDetails.address_line_one ??
        customerDetails.billing_address ??
        '',

      shipper_city: payload.shipper_city ?? customerDetails.city_details?.name ?? '',

      shipper_city_id: shipperCityId,

      shipper_postal_code: payload.shipper_postal_code ?? '',

      shipper_country: payload.shipper_country ?? 'Bahrain',

      shipper_country_id: shipperCountryId,

      shipper_email:
        payload.shipper_email ?? customerDetails.email ?? customerDetails.contact_email ?? '',
    }

    // if (
    //   ![
    //     UserType.CorporateCodCustomer,
    //     UserType.CorporateStandardCustomer,
    //     UserType.NormalCustomer,
    //     UserType.InternationalCustomer,
    //   ].includes(customerDetails.user_type)
    // ) {
    //   return response.badRequest({
    //     status: false,
    //     message: 'The customer is not allowed to create orders',
    //   })
    // }

    const customerType = findCustomerType(customerDetails?.user_type)

    if (draftOrderId) {
      const draftOrder = await DraftOrder.query().where('id', draftOrderId).firstOrFail()
      if (
        (draftOrder.order_created_by_type === OrderCreatedByType.Others &&
          draftOrder.order_created_staff_id !== userId) ||
        draftOrder.order_created_by_type === OrderCreatedByType.MySelf
      ) {
        return response.badRequest({
          status: false,
          message: 'You are not allowed to edit this order',
        })
      }
      await DraftOrder.query()
        .where('id', draftOrderId)
        .update({
          ...payload,
          ...shipperDetails,
          ...recipientData,
          order_type: OrderType.International,
          order_flow_type: OrderFlowType.Forward,
          service_type_id: null,
          pickup_date: payload.pickup_date ? payload.pickup_date.toJSDate() : null,
          total_no_of_packages: package_details.length,
          total_weight: package_details.reduce((acc: number, item: any) => acc + item.weight, 0),
          ref_order_id: ref_order_id || 0,
          carrier: carrier || ShippingCarrier.Aramex,
          pickup_block_id: pickupAddressData.block_id ?? undefined,
          pickup_road_id: pickupAddressData.road_id ?? undefined,
          pickup_building_id: pickupAddressData.building_id ?? undefined,
          pickup_address_id: pickup_address_id ?? undefined,
        })

      await draftOrder.related('draft_order_package_list').query().delete()
      await draftOrder.related('draft_order_package_list').createMany(
        package_details.map((pkg) => ({
          ...pkg,
          customer_input_package_value: pkg?.customer_input_package_value || 0,
        }))
      )

      let calculatedTotalShippingCharge = 0
      try {
        if (payload?.shipper_country && payload.recipient_country) {
          const destinationCountry = await MasterDataCountry.query()
            .where('name', payload.recipient_country)
            .first()

          const originCountry = await MasterDataCountry.query()
            .where('name', payload.shipper_country)
            .first()

          if (destinationCountry?.short_code && originCountry?.short_code) {
            payload.recipient_country = destinationCountry.short_code
            payload.shipper_country = originCountry.short_code
          }
        } else if (payload?.shipper_country_id && payload.recipient_country_id) {
          const destinationCountry = await MasterDataCountry.query()
            .where('id', payload.recipient_country_id)
            .first()

          const originCountry = await MasterDataCountry.query()
            .where('id', payload.shipper_country_id)
            .first()

          if (destinationCountry?.short_code && originCountry?.short_code) {
            payload.recipient_country = destinationCountry.short_code
            payload.shipper_country = originCountry.short_code
          }
        }
        const rateResult = await calculateShippingChargeWithMarkup(
          carrier || ShippingCarrier.Aramex,
          {
            originCity: payload.shipper_city || 'Manama',
            originCountry: payload.shipper_country || 'Bahrain',
            destinationCity: payload.recipient_city || '',
            destinationCountry: payload.recipient_country || 'Bahrain',
            weight: package_details.reduce((acc: number, item: any) => acc + item.weight, 0),
            numberOfPieces: package_details.length,
            productGroup: payload.product_group,
            productType: payload.product_type,
            originPostalCode: payload?.shipper_postal_code ?? draftOrder?.shipper_postal_code ?? '',
            destinationPostalCode:
              payload.recipient_postal_code ?? draftOrder?.recipient_postal_code ?? '',
            width: package_details.reduce((acc: number, item: any) => acc + item.width, 0),
            height: package_details.reduce((acc: number, item: any) => acc + item.height, 0),
            length: package_details.reduce((acc: number, item: any) => acc + item.length, 0),
          },
          created_for_id ?? draftOrder?.created_for_id ?? null
        )
        const rateArray = normalizeRateResult(rateResult)
        const serviceCode: string | null = payload?.service_code ?? draftOrder?.service_code
        const selectedRate = selectRateByServiceCode(rateArray, serviceCode)
        const serviceType = selectedRate?.serviceType ?? selectedRate?.service_code
        console.log('Selected Rate:', serviceType)

        calculatedTotalShippingCharge = selectedRate.amount
        courier_rate = selectedRate?.courier_rate || 0
        margin = selectedRate?.margin || 0
        await DraftOrder.query().where('id', draftOrderId).update({
          calculated_total_shipping_charge: calculatedTotalShippingCharge,
          courier_rate: courier_rate,
          margin: margin,
        })
      } catch (error) {
        logger.error(error, 'Failed to calculate shipping rate during draft update')
        if (error.message.toLowerCase().includes('postal code')) {
          return response.badRequest({
            status: false,
            message: error.message,
          })
        }
      }

      const draftOrderDetails = await DraftOrder.query()
        .where('id', draftOrderId)
        .preload('draft_order_package_list', (draftOrderPackageQuery) => {
          draftOrderPackageQuery.preload('package_type_details')
        })
        .preload('created_by_details')
        .preload('created_for_details')
        .preload('service_type_details')
        .preload('pickup_block_details')
        .preload('pickup_road_details')
        .preload('pickup_building_details')
        .preload('destination_block_details')
        .preload('destination_road_details')
        .preload('destination_building_details')
        .preload('pickup_address_details')
        .preload('shipper_city_details')
        .preload('shipper_country_details')
        .preload('recipient_city_details')
        .preload('recipient_country_details')
        .firstOrFail()

      return response.ok({
        status: true,
        message: 'Draft order updated successfully',
        data: draftOrderDetails,
      })
    }

    pickup_customer_name =
      pickup_customer_name ||
      customerDetails.company_name ||
      `${customerDetails.first_name} ${customerDetails.last_name}`
    pickup_mobile_number = pickup_mobile_number || customerDetails.phone

    let calculatedTotalShippingCharge = 0

    // Calculate shipping charge with Delybell markup
    try {
      if (payload?.shipper_country && payload.recipient_country) {
        const destinationCountry = await MasterDataCountry.query()
          .where('name', payload.recipient_country)
          .first()

        const originCountry = await MasterDataCountry.query()
          .where('name', payload.shipper_country)
          .first()

        if (destinationCountry?.short_code && originCountry?.short_code) {
          payload.recipient_country = destinationCountry.short_code
          payload.shipper_country = originCountry.short_code
        }
      } else if (payload?.shipper_country_id && payload.recipient_country_id) {
        const destinationCountry = await MasterDataCountry.query()
          .where('id', payload.recipient_country_id)
          .first()

        const originCountry = await MasterDataCountry.query()
          .where('id', payload.shipper_country_id)
          .first()

        if (destinationCountry?.short_code && originCountry?.short_code) {
          payload.recipient_country = destinationCountry.short_code
          payload.shipper_country = originCountry.short_code
        }
      }
      if (!payload?.shipper_postal_code || !payload?.recipient_postal_code) {
        return response.badRequest({
          status: false,
          message: 'Postal code is required',
        })
      }
      console.log(payload, 'payload')
      const rateResult = await calculateShippingChargeWithMarkup(
        carrier || ShippingCarrier.Aramex,
        {
          originCity: payload.shipper_city || 'Manama',
          originCountry: payload.shipper_country || 'Bahrain',
          destinationCity: payload.recipient_city || '',
          destinationCountry: payload.recipient_country || 'Bahrain',
          weight: package_details.reduce((acc: number, item: any) => acc + item.weight, 0),
          numberOfPieces: package_details.length,
          productGroup: payload.product_group,
          productType: payload.product_type,
          originPostalCode: payload.shipper_postal_code,
          destinationPostalCode: payload.recipient_postal_code,
          width: package_details.reduce((acc: number, item: any) => acc + item.width, 0),
          height: package_details.reduce((acc: number, item: any) => acc + item.height, 0),
          length: package_details.reduce((acc: number, item: any) => acc + item.length, 0),
        },
        created_for_id
      )
      const rateArray = normalizeRateResult(rateResult)
      const serviceCode: string | null = payload?.service_code ?? ''
      const selectedRate = selectRateByServiceCode(rateArray, serviceCode)
      const serviceType = selectedRate?.serviceType ?? selectedRate?.service_code

      calculatedTotalShippingCharge = selectedRate?.amount ?? 0
      courier_rate = selectedRate?.courier_rate || 0
      margin = selectedRate?.margin || 0
      if (!serviceType && payload?.recipient_postal_code && payload?.shipper_postal_code) {
        return response.badRequest({
          status: false,
          message: 'We do not currently service this postal code',
        })
      }
    } catch (error) {
      logger.error(error, 'Failed to calculate shipping rate during draft update')
      if (
        error.message.toLowerCase().includes('postal code') ||
        payload?.recipient_postal_code ||
        payload?.shipper_postal_code
      ) {
        return response.badRequest({
          status: false,
          message: 'We do not currently service this postal code',
        })
      }
    }

    const draftOrder = await DraftOrder.create({
      ...payload,
      ...shipperDetails,
      ...recipientData,
      order_type: OrderType.International,
      order_flow_type: OrderFlowType.Forward,
      service_type_id: undefined,
      customer_type: customerType ?? CustomerTypeForOrder.WalkingCustomer,
      created_by_id: createdById,
      created_for_id: created_for_id,
      order_created_by_type: OrderCreatedByType.Others,
      order_created_staff_id: userId,
      total_customer_input_package_value: package_details.reduce(
        (acc, item) => acc + (item.customer_input_package_value ?? 0),
        0
      ),
      total_no_of_packages: package_details.length,
      total_weight: package_details.reduce((acc: number, item: any) => acc + item.weight, 0),
      pickup_customer_name,
      pickup_mobile_number,
      calculated_total_shipping_charge: calculatedTotalShippingCharge,
      courier_rate: courier_rate || 0,
      margin: margin || 0,
      is_draft_created: true,
      ref_order_id: ref_order_id || 0,
      carrier: carrier || ShippingCarrier.Aramex,
      pickup_block_id: pickupAddressData.block_id ?? undefined,
      pickup_road_id: pickupAddressData.road_id ?? undefined,
      pickup_building_id: pickupAddressData.building_id ?? undefined,
      pickup_address_id: pickup_address_id ?? undefined,
    })

    await draftOrder.related('draft_order_package_list').createMany(
      package_details.map((pkg) => ({
        ...pkg,
        customer_input_package_value: pkg?.customer_input_package_value || 0,
      }))
    )

    const draftOrderDetails = await DraftOrder.query()
      .where('id', draftOrder.id)
      .preload('draft_order_package_list', (draftOrderPackageQuery) => {
        draftOrderPackageQuery.preload('package_type_details')
      })
      .preload('created_by_details')
      .preload('created_for_details')
      .preload('shipper_city_details')
      .preload('shipper_country_details')
      .preload('recipient_city_details')
      .preload('recipient_country_details')
      .firstOrFail()

    return response.created({
      status: true,
      message: 'Draft order created successfully',
      data: draftOrderDetails,
    })
  }

  async detailsInternationalDraftOrderByAdmin({ auth, params, response }: HttpContext) {
    const userId = auth.user?.id
    const draftOrderId: number = params.id

    const draftOrder = await DraftOrder.query()
      .where('order_type', OrderType.International)
      .where('order_created_by_type', OrderCreatedByType.Others)
      .where('order_created_staff_id', userId as number)
      .where('id', draftOrderId)
      .where('is_draft_created', true)
      .where('is_order_placed', false)
      .preload('draft_order_package_list', (draftOrderPackageQuery) => {
        draftOrderPackageQuery.preload('package_type_details')
      })
      .preload('created_by_details')
      .preload('created_for_details')
      .preload('order_created_staff_id_details')
      .preload('shipper_city_details')
      .preload('shipper_country_details')
      .preload('recipient_city_details')
      .preload('recipient_country_details')
      .firstOrFail()

    return response.ok({
      status: true,
      message: 'Draft orders details fetched successfully',
      data: draftOrder,
    })
  }

  async deleteInternationalDraftOrderByAdmin({ auth, params, response }: HttpContext) {
    const adminId = auth.user?.id

    const draftOrderId = sanitizeIdOrEncryptedId(params.id)

    const draftDetails = await DraftOrder.query()
      .where('id', draftOrderId)
      .where('order_type', OrderType.International)
      .where('order_created_by_type', OrderCreatedByType.Others)
      .where('order_created_staff_id', adminId as number)
      .firstOrFail()

    await draftDetails.delete()

    return response.ok({
      status: true,
      message: 'Draft order deleted successfully',
    })
  }

  async clearInternationalDraftOrderByAdmin({ auth, response }: HttpContext) {
    const adminId = auth.user?.id

    await DraftOrder.query()
      .where('order_type', OrderType.International)
      .where('order_created_by_type', OrderCreatedByType.Others)
      .where('order_created_staff_id', adminId as number)
      .where('is_order_placed', false)
      .delete()

    return response.ok({
      status: true,
      message: 'Draft orders cleared successfully',
    })
  }

  async placeInternationalOrderByAdmin({ auth, response }: HttpContext) {
    const userId = auth.user?.id

    const draftOrderDetails = await DraftOrder.query()
      .where('order_type', OrderType.International)
      .where('order_created_by_type', OrderCreatedByType.Others)
      .where('order_created_staff_id', userId as number)
      .where('is_draft_created', true)
      .where('is_order_placed', false)
      .where('is_future_pickup', false)
      .preload('draft_order_package_list')

    if (draftOrderDetails.length === 0) {
      return response.badRequest({
        status: false,
        message: 'No draft orders found',
      })
    }

    const createdOrderIds: number[] = []

    for (const draftOrder of draftOrderDetails) {
      const {
        id,
        is_future_pickup,
        is_draft_created,
        is_order_placed,
        pickup_date,
        pickup_slot_type,
        created_at,
        updated_at,
        shipper_company_name,
        shipper_name,
        shipper_address,
        shipper_city,
        shipper_postal_code,
        shipper_country,
        shipper_email,
        shipper_tax_no,
        recipient_company_name,
        recipient_name,
        recipient_address,
        recipient_city,
        recipient_postal_code,
        recipient_country,
        recipient_email,
        recipient_tax_no,
        description,
        product_group,
        product_type,
        payment_type,
        customs_value,
        currency,
        carrier,
        shipper_city_id,
        shipper_country_id,
        recipient_city_id,
        recipient_country_id,
        service_code,
        courier_rate,
        margin,
        ...orderData
      } = draftOrder.$original

      const customerDetails = draftOrder.created_for_id
        ? await Customer.query().where('id', draftOrder.created_for_id).firstOrFail()
        : {
            company_name: shipper_company_name,
            first_name: shipper_name,
            last_name: '',
            phone: '',
            email: shipper_email,
            address_line_one: shipper_address,
            address_line_two: '',
            city: shipper_city,
            state: '',
            postal_code: shipper_postal_code,
            country: shipper_country,
            latitude: '',
            longitude: '',
            timezone: '',
            currency: currency,
            user_type: 'Customer',
            is_active: true,
            is_deleted: false,
            created_by: userId,
            updated_by: userId,
            created_at: created_at,
            updated_at: updated_at,
          }
      const routeDetails = await getBlockAssignedDrivers(draftOrder.$original.pickup_block_id)
      const isSingleDeliveryAgentAvailable = routeDetails.length === 1

      const order = await Order.create({
        ...orderData,
        status: isSingleDeliveryAgentAvailable ? OrderStatus.PendingPickup : OrderStatus.Open,
        status_for_customer: isSingleDeliveryAgentAvailable
          ? OrderStatusForCustomer.PendingPickup
          : OrderStatusForCustomer.Open,
        warehouse_status: WarehouseStatus.NotInStorage,
        pickup_preference_date: pickup_date,
        pickup_preference_slot_type: pickup_slot_type,
        is_pickup_driver_assigned: isSingleDeliveryAgentAvailable ? true : false,
        assigned_pickup_driver_id: isSingleDeliveryAgentAvailable
          ? routeDetails[0].deliveryBoyId
          : undefined,
        is_shipping_charge_required_to_pay: false,
        no_of_packages_remaining_to_pick: draftOrder.total_no_of_packages,
      })

      createdOrderIds.push(order.id)

      // Create International Order details
      await InternationalOrder.create({
        order_id: order.id,
        shipper_company_name: draftOrder.shipper_company_name || order.pickup_customer_name,
        shipper_name: draftOrder.shipper_name || order.pickup_customer_name,
        shipper_phone: order.pickup_mobile_number,
        shipper_address: draftOrder.shipper_address || order.sender_address,
        shipper_city: draftOrder.shipper_city,
        shipper_city_id: draftOrder.shipper_city_id,
        shipper_postal_code: draftOrder.shipper_postal_code,
        shipper_country: draftOrder.shipper_country,
        shipper_country_id: draftOrder.shipper_country_id,
        shipper_email: draftOrder.shipper_email,
        shipper_tax_no: draftOrder.shipper_tax_no,

        recipient_company_name:
          draftOrder.recipient_company_name || order.destination_customer_name,
        recipient_name: draftOrder.recipient_name || order.destination_customer_name,
        recipient_phone: order.destination_mobile_number,
        recipient_address: draftOrder.recipient_address || order.destination_address,
        recipient_city: draftOrder.recipient_city,
        recipient_city_id: draftOrder.recipient_city_id,
        recipient_postal_code: draftOrder.recipient_postal_code,
        recipient_country: draftOrder.recipient_country,
        recipient_country_id: draftOrder.recipient_country_id,
        recipient_email: draftOrder.recipient_email,
        recipient_tax_no: draftOrder.recipient_tax_no,
        service_code: draftOrder?.service_code,
        description: draftOrder.description,
        product_group: draftOrder.product_group,
        product_type: draftOrder.product_type,
        payment_type: draftOrder.payment_type,
        customs_value: draftOrder.customs_value,
        currency: draftOrder.currency,
        courier_rate: draftOrder.courier_rate || 0,
        margin: draftOrder.margin || 0,
        carrier: draftOrder.carrier || ShippingCarrier.Aramex,
      })

      if ((draftOrder.ref_order_id || 0) > 0) {
        const originalOrderId = await orderGeneratedIdById(draftOrder.ref_order_id)
        await createComprehensiveOrderHistory(
          order.id,
          auth?.user?.id as number,
          OrderHistoryActions.OrderPlaced,
          {},
          `↩️ Return order #${order.generated_order_id} created for original order #${originalOrderId} by ${customerDetails.company_name || customerDetails.first_name}. Packages: ${order.total_no_of_packages}, Total Weight: ${order.total_weight}.`
        )

        await createComprehensiveOrderHistory(
          draftOrder.ref_order_id,
          auth?.user?.id as number,
          OrderHistoryActions.Return,
          {},
          `↩️ Return order #${order.generated_order_id} created from this order by ${customerDetails.company_name || customerDetails.first_name}. Packages: ${order.total_no_of_packages}, Total Weight: ${order.total_weight}.`
        )

        await PublicTrack.create({
          order_id: order.id,
          status: PublicTrackStatus.Placed,
          tracking_details: `↩️ Return order created for original order #${originalOrderId}`,
        })
      } else {
        await createComprehensiveOrderHistory(
          order.id,
          auth?.user?.id as number,
          OrderHistoryActions.OrderPlaced,
          {},
          `✨ International Order #${order?.generated_order_id} was placed by ${auth?.user?.first_name} ${auth?.user?.last_name || ''} (${auth?.user?.email}).`
        )

        await PublicTrack.create({
          order_id: order.id,
          status: PublicTrackStatus.Placed,
          tracking_details: `✨ Your order has been placed successfully.`,
        })
      }

      // Create Order Packages
      for (const eachPackage of draftOrder.draft_order_package_list) {
        delete eachPackage.$original.id
        delete eachPackage.$original.draft_order_id
        delete eachPackage.$original.created_at
        delete eachPackage.$original.updated_at
        const generatedOrderPackageId = await generatePackageId(
          draftOrder.$original.created_for_id,
          draftOrder.$original.total_no_of_packages
        )

        let finalGeneratedOrderPackageId = generatedOrderPackageId
        let prePrintPackageId = ''

        if (eachPackage.$original.external_package_id) {
          const externalPackageId = await ExternalPackageId.query()
            .where('external_package_id', eachPackage.$original.external_package_id)
            .first()

          if (externalPackageId) {
            prePrintPackageId = externalPackageId.external_package_id
          }
        }
        const packageData = { ...eachPackage.$original }
        delete packageData.external_package_id
        delete packageData.external_package_qr_code

        const orderPackage = await order.related('order_package_list').create({
          ...packageData,
          status: isSingleDeliveryAgentAvailable ? PackageStatus.PendingPickup : PackageStatus.Open,
          generated_order_package_id: finalGeneratedOrderPackageId,
          pre_print_package_id: prePrintPackageId,
          is_pickup_driver_assigned: isSingleDeliveryAgentAvailable ? true : false,
          assigned_pickup_driver_id: isSingleDeliveryAgentAvailable
            ? routeDetails[0].deliveryBoyId
            : undefined,
        })

        if (eachPackage.$original.external_package_id) {
          const externalPackageId = await ExternalPackageId.query()
            .where('external_package_id', eachPackage.$original.external_package_id)
            .first()

          if (externalPackageId) {
            externalPackageId.assigned_order_package_id = orderPackage.id
            await externalPackageId.save()
          }
        }
      }

      // Call Shipping Service to create shipment
      // try {
      //   const shippingProvider = ShippingFactory.getProvider(
      //     draftOrder.carrier || ShippingCarrier.Aramex
      //   )
      //   const shipmentResult = await shippingProvider.createShipment(order, internationalOrder)

      //   // Update Order Packages with Tracking Info
      //   await order.load('order_package_list')
      //   for (const pkg of order.order_package_list) {
      //     pkg.tracking_no = shipmentResult.trackingNumber
      //     pkg.barcode_url = shipmentResult.labelUrl || null
      //     await pkg.save()
      //   }
      // } catch (error) {
      //   logger.error(error, 'Failed to create shipment for order ' + order.id)
      //   // Don't fail the request, just log it. Admin can retry or handle manually.
      // }

      await Invoice.create({
        order_id: order.id,
        is_shipping_charge_invoice: true,
        calculated_amount: order.calculated_total_shipping_charge,
        tax_amount: 0,
        discount_amount: 0,
        payable_amount: order.calculated_total_shipping_charge,
        payment_status: InvoicePaymentStatus.Pending,
        due_date: DateTime.now().plus({ days: 30 }),
      })

      draftOrder.is_order_placed = true
      await draftOrder.save()
      if ((draftOrder.ref_order_id || 0) > 0) {
        await Order.query()
          .where('id', draftOrder.ref_order_id as number)
          .update({
            is_return_generated: true,
            generated_return_order_id: order.id || 0,
            status: OrderStatus.Returned,
            status_for_customer: OrderStatusForCustomer.Returned,
          })
      }
    }

    return response.ok({
      status: true,
      message: 'Orders placed successfully',
      data: {
        order_ids: createdOrderIds,
      },
    })
  }

  //Portal api hold branch: rahul_portal_int

  async initiateInternationalDraftOrderByCustomer({ auth, request, response }: HttpContext) {
    const userId = auth.user?.id
    const customerDetails = await Customer.query()
      .where('id', userId as number)
      .firstOrFail()

    let {
      draft_order_id: draftOrderId,
      package_details,
      pickup_customer_name,
      pickup_mobile_number,
      ref_order_id,
      carrier,
      pickup_address_id,
      ...payload
    } = await request.validateUsing(initiateInternationalDraftOrderByCustomerValidator)

    // Resolve country codes for validation
    let shipperCountryCode = payload.shipper_country
    let recipientCountryCode = payload.recipient_country
    let courier_rate = 0
    let margin = 0
    if (shipperCountryCode) {
      const country = await MasterDataCountry.query()
        .where('name', shipperCountryCode)
        .orWhere('short_code', shipperCountryCode)
        .first()
      if (country) shipperCountryCode = country.short_code
    }

    if (recipientCountryCode) {
      const country = await MasterDataCountry.query()
        .where('name', recipientCountryCode)
        .orWhere('short_code', recipientCountryCode)
        .first()
      if (country) recipientCountryCode = country.short_code
    }

    // FedEx Postal Code Validation
    const fedex = ShippingFactory.getProvider(ShippingCarrier.FedEx) as any
    if (payload.shipper_postal_code && shipperCountryCode) {
      // const validation = await fedex.validatePostalCode(
      //   payload.shipper_postal_code,
      //   shipperCountryCode,
      //   payload.shipper_city
      // )
      //       if (!validation.status) {
      //   return response.badRequest({
      //     status: false,
      //     message:
      //       validation.message ||
      //       `Invalid shipper postal code: ${payload.shipper_postal_code} for ${shipperCountryCode}`,
      //   })
      // }
      const validation = validateBahrainPostalCode(payload?.shipper_postal_code)
      if (!validation) {
        return response.badRequest({
          status: false,
          message: `Invalid shipper postal code: ${payload.shipper_postal_code} for ${payload.shipper_country ?? shipperCountryCode}`,
        })
      }
    }

    if (payload.recipient_postal_code && recipientCountryCode) {
      const validation = await fedex.validatePostalCode(
        payload.recipient_postal_code,
        recipientCountryCode,
        payload.recipient_city
      )
      if (!validation.status) {
        return response.badRequest({
          status: false,
          message:
            validation.message ||
            `Invalid recipient postal code: ${payload.recipient_postal_code} for ${recipientCountryCode}`,
        })
      }
    }
    package_details = package_details.map((pkg) => ({
      ...pkg,
      weight: pkg.weight ?? 0,
    }))
    const pickupAddressData = await resolveAddressDetails(pickup_address_id)

    if (ref_order_id) ref_order_id = (ref_order_id as number) || 0

    if (
      ![
        UserType.CorporateCodCustomer,
        UserType.CorporateStandardCustomer,
        UserType.NormalCustomer,
        UserType.InternationalCustomer,
      ].includes(customerDetails.user_type)
    ) {
      return response.badRequest({
        status: false,
        message: 'You are not allowed to create orders',
      })
    }

    const customerType = findCustomerType(customerDetails.user_type)

    if (draftOrderId) {
      const draftOrder = await DraftOrder.query()
        .where('id', draftOrderId)
        .where('created_for_id', userId as number)
        .firstOrFail()

      if (draftOrder.is_order_placed) {
        return response.badRequest({
          status: false,
          message: 'Order already placed',
        })
      }

      await DraftOrder.query()
        .where('id', draftOrderId)
        .update({
          ...payload,
          order_type: OrderType.International,
          order_flow_type: OrderFlowType.Forward,
          service_type_id: null,
          pickup_date: payload.pickup_date ? payload.pickup_date.toJSDate() : null,
          total_no_of_packages: package_details.length,
          total_weight: package_details.reduce((acc: number, item: any) => acc + item.weight, 0),
          ref_order_id: ref_order_id || 0,
          carrier: carrier || ShippingCarrier.Aramex,
          pickup_block_id: pickupAddressData.block_id ?? undefined,
          pickup_road_id: pickupAddressData.road_id ?? undefined,
          pickup_building_id: pickupAddressData.building_id ?? undefined,
          pickup_address_id: pickup_address_id ?? undefined,
          product_type: payload?.product_type
            ? String(payload?.product_type).toLowerCase()
            : 'parcel',
        })

      await draftOrder.related('draft_order_package_list').query().delete()
      await draftOrder.related('draft_order_package_list').createMany(
        package_details.map((pkg) => ({
          ...pkg,
          customer_input_package_value: pkg?.customer_input_package_value || 0,
        }))
      )

      let calculatedTotalShippingCharge = 0
      try {
        if (payload?.shipper_country && payload.recipient_country) {
          const destinationCountry = await MasterDataCountry.query()
            .where('name', payload.recipient_country)
            .first()

          const originCountry = await MasterDataCountry.query()
            .where('name', payload.shipper_country)
            .first()

          if (destinationCountry?.short_code && originCountry?.short_code) {
            payload.recipient_country = destinationCountry.short_code
            payload.shipper_country = originCountry.short_code
          }
        }
        const rateResult = await calculateShippingChargeWithMarkup(
          carrier || ShippingCarrier.Aramex,
          {
            originCity: payload.shipper_city || 'Manama',
            originCountry: payload.shipper_country || 'Bahrain',
            destinationCity: payload.recipient_city || '',
            destinationCountry: payload.recipient_country || 'Bahrain',
            weight: package_details.reduce((acc: number, item: any) => acc + item.weight, 0),
            numberOfPieces: package_details.length,
            productGroup: payload.product_group,
            productType: payload.product_type,
            originPostalCode: payload?.shipper_postal_code ?? draftOrder?.shipper_postal_code ?? '',
            destinationPostalCode:
              payload.recipient_postal_code ?? draftOrder?.recipient_postal_code ?? '',
            width: package_details.reduce((acc: number, item: any) => acc + item.width, 0),
            height: package_details.reduce((acc: number, item: any) => acc + item.height, 0),
            length: package_details.reduce((acc: number, item: any) => acc + item.length, 0),
          },
          userId
        )
        const rateArray = normalizeRateResult(rateResult)
        const serviceCode: string | null = payload?.service_code ?? draftOrder?.service_code
        const selectedRate = selectRateByServiceCode(rateArray, serviceCode)
        const serviceType = selectedRate?.serviceType ?? selectedRate?.service_code

        if (!serviceType && payload?.recipient_postal_code && payload?.shipper_postal_code) {
          return response.badRequest({
            status: false,
            message: 'We do not currently service this postal code',
          })
        }
        console.log('Selected Rate:', serviceType)

        calculatedTotalShippingCharge = selectedRate?.amount ?? 0
        courier_rate = selectedRate?.courier_rate || 0
        margin = selectedRate?.margin || 0
        await DraftOrder.query().where('id', draftOrderId).update({
          calculated_total_shipping_charge: calculatedTotalShippingCharge,
          courier_rate,
          margin,
        })
      } catch (error) {
        logger.error(error, 'Failed to calculate shipping rate during draft update')
        if (
          error.message.toLowerCase().includes('postal code') ||
          payload?.recipient_postal_code ||
          payload?.shipper_postal_code
        ) {
          return response.badRequest({
            status: false,
            message: 'We do not currently service this postal code',
          })
        }
      }

      const draftOrderDetails = await DraftOrder.query()
        .where('id', draftOrderId)
        .preload('draft_order_package_list', (draftOrderPackageQuery) => {
          draftOrderPackageQuery.preload('package_type_details')
        })
        .preload('created_by_details')
        .preload('created_for_details')
        .preload('shipper_city_details')
        .preload('shipper_country_details')
        .preload('recipient_city_details')
        .preload('recipient_country_details')
        .firstOrFail()

      return response.ok({
        status: true,
        message: 'Draft order updated successfully',
        data: draftOrderDetails,
      })
    }

    pickup_customer_name =
      pickup_customer_name ||
      customerDetails.company_name ||
      `${customerDetails.first_name} ${customerDetails.last_name}`
    pickup_mobile_number = pickup_mobile_number || customerDetails.phone

    let calculatedTotalShippingCharge = 0

    try {
      if (payload?.shipper_country && payload.recipient_country) {
        const destinationCountry = await MasterDataCountry.query()
          .where('name', payload.recipient_country)
          .first()

        const originCountry = await MasterDataCountry.query()
          .where('name', payload.shipper_country)
          .first()

        if (destinationCountry?.short_code && originCountry?.short_code) {
          payload.recipient_country = destinationCountry.short_code
          payload.shipper_country = originCountry.short_code
        }
      }
      const rateResult = await calculateShippingChargeWithMarkup(
        carrier || ShippingCarrier.Aramex,
        {
          originCity: payload.shipper_city || 'Manama',
          originCountry: payload.shipper_country || 'Bahrain',
          destinationCity: payload.recipient_city || '',
          destinationCountry: payload.recipient_country || 'Bahrain',
          weight: package_details.reduce((acc: number, item: any) => acc + item.weight, 0),
          numberOfPieces: package_details.length,
          productGroup: payload.product_group,
          productType: payload.product_type,
          originPostalCode: payload?.shipper_postal_code ?? '',
          destinationPostalCode: payload.recipient_postal_code ?? '',
          width: package_details.reduce((acc: number, item: any) => acc + item.width, 0),
          height: package_details.reduce((acc: number, item: any) => acc + item.height, 0),
          length: package_details.reduce((acc: number, item: any) => acc + item.length, 0),
        },
        userId
      )
      const rateArray = normalizeRateResult(rateResult)
      const serviceCode: string = payload?.service_code ?? ''
      const selectedRate = selectRateByServiceCode(rateArray, serviceCode)
      const serviceType = selectedRate?.serviceType ?? selectedRate?.service_code
      console.log('Selected Rate:', serviceType)

      calculatedTotalShippingCharge = selectedRate?.amount ?? 0
      courier_rate = selectedRate?.courier_rate || 0
      margin = selectedRate?.margin || 0
    } catch (error) {
      logger.error(error, 'Failed to calculate shipping rate during draft creation')
      if (error.message.toLowerCase().includes('postal code')) {
        return response.badRequest({
          status: false,
          message: error.message,
        })
      }
    }

    const { resolvedCityId: recipientCityId, resolvedCountryId: recipientCountryId } =
      await this.resolveCityAndCountryIds(
        payload.recipient_city,
        payload.recipient_city_id,
        payload.recipient_country ?? 'SA',
        payload.recipient_country_id
      )

    const { resolvedCityId: shipperCityId, resolvedCountryId: shipperCountryId } =
      await this.resolveCityAndCountryIds(
        payload.shipper_city ?? customerDetails.city_details?.name,
        payload.shipper_city_id,
        payload.shipper_country ?? 'Bahrain',
        payload.shipper_country_id
      )

    const draftOrder = await DraftOrder.create({
      ...payload,
      order_type: OrderType.International,
      order_flow_type: OrderFlowType.Forward,
      service_type_id: undefined,
      customer_type: customerType,
      created_by_id: userId,
      created_for_id: userId,
      order_created_by_type: OrderCreatedByType.MySelf,
      order_created_staff_id: undefined,
      total_customer_input_package_value: package_details.reduce(
        (acc, item) => acc + (item.customer_input_package_value ?? 0),
        0
      ),
      total_no_of_packages: package_details.length,
      total_weight: package_details.reduce((acc: number, item: any) => acc + item.weight, 0),
      pickup_customer_name,
      pickup_mobile_number,
      calculated_total_shipping_charge: calculatedTotalShippingCharge,
      courier_rate,
      margin,
      is_draft_created: true,
      ref_order_id: ref_order_id || 0,
      carrier: carrier || ShippingCarrier.Aramex,
      shipper_city_id: shipperCityId,
      shipper_country_id: shipperCountryId,
      recipient_city_id: recipientCityId,
      recipient_country_id: recipientCountryId,
      pickup_block_id: pickupAddressData.block_id ?? undefined,
      pickup_road_id: pickupAddressData.road_id ?? undefined,
      pickup_building_id: pickupAddressData.building_id ?? undefined,
      pickup_address_id: pickup_address_id ?? undefined,
      product_type: payload?.product_type ? String(payload?.product_type).toLowerCase() : 'parcel',
    })

    await draftOrder.related('draft_order_package_list').createMany(
      package_details.map((pkg) => ({
        ...pkg,
        customer_input_package_value: pkg?.customer_input_package_value || 0,
      }))
    )

    const draftOrderDetails = await DraftOrder.query()
      .where('id', draftOrder.id)
      .preload('draft_order_package_list', (draftOrderPackageQuery) => {
        draftOrderPackageQuery.preload('package_type_details')
      })
      .preload('created_by_details')
      .preload('created_for_details')
      .preload('shipper_city_details')
      .preload('shipper_country_details')
      .preload('recipient_city_details')
      .preload('recipient_country_details')
      .firstOrFail()

    return response.created({
      status: true,
      message: 'Draft order created successfully',
      data: draftOrderDetails,
    })
  }

  async detailsInternationalDraftOrderByCustomer({ auth, params, response }: HttpContext) {
    const userId = auth.user?.id
    const draftOrderId: number = params.id

    const draftOrder = await DraftOrder.query()
      .where('order_type', OrderType.International)
      .where('created_for_id', userId as number)
      .where('id', draftOrderId)
      .where('is_draft_created', true)
      .where('is_order_placed', false)
      .preload('draft_order_package_list', (draftOrderPackageQuery) => {
        draftOrderPackageQuery.preload('package_type_details')
      })
      .preload('created_by_details')
      .preload('created_for_details')
      .preload('shipper_city_details')
      .preload('shipper_country_details')
      .preload('recipient_city_details')
      .preload('recipient_country_details')
      .firstOrFail()

    return response.ok({
      status: true,
      message: 'Draft orders details fetched successfully',
      data: draftOrder,
    })
  }

  async deleteInternationalDraftOrderByCustomer({ auth, params, response }: HttpContext) {
    const userId = auth.user?.id

    const draftOrderId = sanitizeIdOrEncryptedId(params.id)

    const draftDetails = await DraftOrder.query()
      .where('id', draftOrderId)
      .where('order_type', OrderType.International)
      .where('created_for_id', userId as number)
      .firstOrFail()

    await draftDetails.delete()

    return response.ok({
      status: true,
      message: 'Draft order deleted successfully',
    })
  }

  async clearInternationalDraftOrderByCustomer({ auth, response }: HttpContext) {
    const userId = auth.user?.id

    await DraftOrder.query()
      .where('order_type', OrderType.International)
      .where('created_for_id', userId as number)
      .where('is_order_placed', false)
      .delete()

    return response.ok({
      status: true,
      message: 'Draft orders cleared successfully',
    })
  }

  async placeInternationalOrderByCustomer({ auth, response }: HttpContext) {
    const userId = auth.user?.id

    const draftOrderDetails = await DraftOrder.query()
      .where('order_type', OrderType.International)
      .where('order_created_by_type', OrderCreatedByType.MySelf)
      .where('created_for_id', userId as number)
      .where('is_draft_created', true)
      .where('is_order_placed', false)
      .where('is_future_pickup', false)
      .preload('draft_order_package_list')
      .orderBy('created_at', 'desc')
      .limit(1)

    if (draftOrderDetails.length === 0) {
      return response.badRequest({
        status: false,
        message: 'No draft orders found',
      })
    }

    const placedOrders: {
      order_id: number
      generated_order_id: string
    }[] = []

    for (const draftOrder of draftOrderDetails) {
      const {
        id,
        is_future_pickup,
        is_draft_created,
        is_order_placed,
        pickup_date,
        pickup_slot_type,
        created_at,
        updated_at,
        shipper_company_name,
        shipper_name,
        shipper_address,
        shipper_city,
        shipper_postal_code,
        shipper_country,
        shipper_email,
        shipper_tax_no,
        recipient_company_name,
        recipient_name,
        recipient_address,
        recipient_city,
        recipient_postal_code,
        recipient_country,
        recipient_email,
        recipient_tax_no,
        description,
        product_group,
        product_type,
        payment_type,
        customs_value,
        currency,
        carrier,
        shipper_city_id,
        shipper_country_id,
        recipient_city_id,
        recipient_country_id,
        service_code,
        courier_rate,
        margin,
        ...orderData
      } = draftOrder.$original

      const routeDetails = await getBlockAssignedDrivers(draftOrder.$original.pickup_block_id)
      const isSingleDeliveryAgentAvailable = routeDetails.length === 1

      const customerDetails = await Customer.query()
        .where('id', draftOrder.created_for_id)
        .firstOrFail()

      const order = await Order.create({
        ...orderData,
        status: isSingleDeliveryAgentAvailable ? OrderStatus.PendingPickup : OrderStatus.Open,
        status_for_customer: isSingleDeliveryAgentAvailable
          ? OrderStatusForCustomer.PendingPickup
          : OrderStatusForCustomer.Open,
        warehouse_status: WarehouseStatus.NotInStorage,
        pickup_preference_date: pickup_date ? pickup_date : DateTime.now().toFormat('yyyy-MM-dd'),
        pickup_preference_slot_type: pickup_slot_type
          ? pickup_slot_type
          : DeliveryPickupSlotType.Morning,
        is_shipping_charge_required_to_pay: false,
        no_of_packages_remaining_to_pick: draftOrder.total_no_of_packages,
        is_pickup_driver_assigned: isSingleDeliveryAgentAvailable ? true : false,
        assigned_pickup_driver_id: isSingleDeliveryAgentAvailable
          ? routeDetails[0].deliveryBoyId
          : undefined,
      })
      placedOrders.push({
        order_id: order.id,
        generated_order_id: order.generated_order_id,
      })

      // Create International Order details
      await InternationalOrder.create({
        order_id: order.id,
        shipper_company_name: draftOrder.shipper_company_name || order.pickup_customer_name,
        shipper_name: draftOrder.shipper_name || order.pickup_customer_name,
        shipper_phone: order.pickup_mobile_number,
        shipper_address: draftOrder.shipper_address || order.sender_address,
        shipper_city: draftOrder.shipper_city,
        shipper_city_id: draftOrder.shipper_city_id,
        shipper_postal_code: draftOrder.shipper_postal_code,
        shipper_country: draftOrder.shipper_country,
        shipper_country_id: draftOrder.shipper_country_id,
        shipper_email: draftOrder.shipper_email,
        shipper_tax_no: draftOrder.shipper_tax_no,
        recipient_company_name:
          draftOrder.recipient_company_name || order.destination_customer_name,
        recipient_name: draftOrder.recipient_name || order.destination_customer_name,
        recipient_phone: order.destination_mobile_number,
        recipient_address: draftOrder.recipient_address || order.destination_address,
        recipient_city: draftOrder.recipient_city,
        recipient_city_id: draftOrder.recipient_city_id,
        recipient_postal_code: draftOrder.recipient_postal_code,
        recipient_country: draftOrder.recipient_country,
        recipient_country_id: draftOrder.recipient_country_id,
        recipient_email: draftOrder.recipient_email,
        recipient_tax_no: draftOrder.recipient_tax_no,
        service_code: draftOrder?.service_code,
        description: draftOrder.description,
        product_group: draftOrder.product_group,
        product_type: draftOrder.product_type,
        payment_type: draftOrder.payment_type,
        customs_value: draftOrder.customs_value,
        currency: draftOrder.currency,
        courier_rate: draftOrder.courier_rate || 0,
        margin: draftOrder?.margin || 0,
        carrier: draftOrder.carrier || ShippingCarrier.Aramex,
      })

      if ((draftOrder.ref_order_id || 0) > 0) {
        await createComprehensiveOrderHistory(
          order.id,
          auth?.user?.id as number,
          OrderHistoryActions.OrderPlaced,
          {},
          `↩️ Return order #${order.generated_order_id} created for original order #${await orderGeneratedIdById(draftOrder.ref_order_id)} by ${customerDetails.company_name || customerDetails.first_name}. Packages: ${order.total_no_of_packages}, Total Weight: ${order.total_weight}.`
        )
        await createComprehensiveOrderHistory(
          draftOrder.ref_order_id,
          auth?.user?.id as number,
          OrderHistoryActions.Return,
          {},
          `↩️ Return order #${order.generated_order_id} created from this order by ${customerDetails.company_name || customerDetails.first_name}. Packages: ${order.total_no_of_packages}, Total Weight: ${order.total_weight}.`
        )

        await PublicTrack.create({
          order_id: order.id,
          status: PublicTrackStatus.Placed,
          tracking_details: `✨ Your order has been placed successfully.`,
        })
      } else {
        await createComprehensiveOrderHistory(
          order.id,
          auth?.user?.id as number,
          OrderHistoryActions.OrderPlaced,
          {},
          `✨ International Order #${order?.generated_order_id} was placed by ${auth?.user?.first_name} ${auth?.user?.last_name || ''} (${auth?.user?.email}).`
        )

        await PublicTrack.create({
          order_id: order.id,
          status: PublicTrackStatus.Placed,
          tracking_details: `✨ Your order has been placed successfully.`,
        })
      }

      // Create Order Packages
      for (const eachPackage of draftOrder.draft_order_package_list) {
        delete eachPackage.$original.id
        delete eachPackage.$original.draft_order_id
        delete eachPackage.$original.created_at
        delete eachPackage.$original.updated_at
        const generatedOrderPackageId = await generatePackageId(
          draftOrder.$original.created_for_id,
          draftOrder.$original.total_no_of_packages
        )

        let finalGeneratedOrderPackageId = generatedOrderPackageId
        let prePrintPackageId = ''

        if (eachPackage.$original.external_package_id) {
          const externalPackageId = await ExternalPackageId.query()
            .where('external_package_id', eachPackage.$original.external_package_id)
            .first()

          if (externalPackageId) {
            prePrintPackageId = externalPackageId.external_package_id
          }
        }
        const packageData = { ...eachPackage.$original }
        delete packageData.external_package_id
        delete packageData.external_package_qr_code

        const orderPackage = await order.related('order_package_list').create({
          ...packageData,
          status: isSingleDeliveryAgentAvailable ? PackageStatus.PendingPickup : PackageStatus.Open,
          generated_order_package_id: finalGeneratedOrderPackageId,
          pre_print_package_id: prePrintPackageId,
          is_pickup_driver_assigned: isSingleDeliveryAgentAvailable ? true : false,
          assigned_pickup_driver_id: isSingleDeliveryAgentAvailable
            ? routeDetails[0].deliveryBoyId
            : undefined,
        })

        if (eachPackage.$original.external_package_id) {
          const externalPackageId = await ExternalPackageId.query()
            .where('external_package_id', eachPackage.$original.external_package_id)
            .first()

          if (externalPackageId) {
            externalPackageId.assigned_order_package_id = orderPackage.id
            await externalPackageId.save()
          }
        }
      }

      // Shipment creation moved to pickup phase in DeliveryAgentsController

      await Invoice.create({
        order_id: order.id,
        is_shipping_charge_invoice: true,
        calculated_amount: order.calculated_total_shipping_charge,
        tax_amount: 0,
        discount_amount: 0,
        payable_amount: order.calculated_total_shipping_charge,
        payment_status: InvoicePaymentStatus.Pending,
        due_date: DateTime.now().plus({ days: 30 }),
      })

      draftOrder.is_order_placed = true
      await draftOrder.save()
      if ((draftOrder.ref_order_id || 0) > 0) {
        await Order.query()
          .where('id', draftOrder.ref_order_id as number)
          .update({
            is_return_generated: true,
            generated_return_order_id: order.id || 0,
            status: OrderStatus.Returned,
            status_for_customer: OrderStatusForCustomer.Returned,
          })
      }
    }

    return response.ok({
      status: true,
      message: 'Orders placed successfully',
      data: {
        orders: placedOrders,
      },
    })
  }

  async editInternationalOrder({ auth, request, response }: HttpContext) {
    const { service_code, ...validatedData } = await request.validateUsing(
      editInternationalOrderValidator
    )

    // Resolve country codes for validation
    let shipperCountryCode = validatedData.shipper_country
    let recipientCountryCode = validatedData.recipient_country
    let courier_rate = 0
    let margin = 0

    if (shipperCountryCode) {
      const country = await MasterDataCountry.query()
        .where('name', shipperCountryCode)
        .orWhere('short_code', shipperCountryCode)
        .first()
      if (country) shipperCountryCode = country.short_code
    }

    if (recipientCountryCode) {
      const country = await MasterDataCountry.query()
        .where('name', recipientCountryCode)
        .orWhere('short_code', recipientCountryCode)
        .first()
      if (country) recipientCountryCode = country.short_code
    }

    // FedEx Postal Code Validation
    const fedex = ShippingFactory.getProvider(ShippingCarrier.FedEx) as any
    if (validatedData.shipper_postal_code && shipperCountryCode) {
      // const validation = await fedex.validatePostalCode(
      //   validatedData.shipper_postal_code,
      //   shipperCountryCode,
      //   validatedData.shipper_city
      // )
      // if (!validation.status) {
      //   return response.badRequest({
      //     status: false,
      //     message:
      //       validation.message ||
      //       `Invalid shipper postal code: ${validatedData.shipper_postal_code} for ${shipperCountryCode}`,
      //   })
      // }

      const validation = validateBahrainPostalCode(validatedData?.shipper_postal_code)
      if (!validation) {
        return response.badRequest({
          status: false,
          message: `Invalid shipper postal code: ${validatedData.shipper_postal_code} for ${validatedData.shipper_country ?? shipperCountryCode}`,
        })
      }
    }

    if (validatedData.recipient_postal_code && recipientCountryCode) {
      const validation = await fedex.validatePostalCode(
        validatedData.recipient_postal_code,
        recipientCountryCode,
        validatedData.recipient_city
      )
      if (!validation.status) {
        return response.badRequest({
          status: false,
          message:
            validation.message ||
            `Invalid recipient postal code: ${validatedData.recipient_postal_code} for ${recipientCountryCode}`,
        })
      }
    }

    const { order_id } = validatedData
    const pickupAddressData = await resolveAddressDetails(validatedData.pickup_address_id)
    const order = await Order.query()
      .where('id', order_id)
      .whereIn('status', [
        OrderStatus.Open,
        OrderStatus.PendingPickup,
        OrderStatus.Picked,
        OrderStatus.PartialPickUp,
        OrderStatus.AtWarehouse,
        OrderStatus.PartialAtWarehouse,
      ])
      .preload('international_order_details')
      .preload('order_package_list')
      .firstOrFail()

    const internationalOrder = order.international_order_details
    if (!internationalOrder) {
      return response.badRequest({
        status: false,
        message: 'International order details not found',
      })
    }

    // Update Order fields
    const orderUpdateData: any = {}
    const orderFields = [
      'customer_input_order_id',
      'pickup_customer_name',
      'pickup_mobile_number',
      'pickup_alternate_number',
      'delivery_instructions',
      'destination_customer_name',
      'destination_mobile_number',
      'destination_alternate_number',
      'pickup_address_id',
    ]

    for (const field of orderFields) {
      if (validatedData[field as keyof typeof validatedData] !== undefined) {
        orderUpdateData[field] = validatedData[field as keyof typeof validatedData]
      }
    }

    // Handle pickup date
    if (validatedData.pickup_date) {
      orderUpdateData.pickup_preference_date = validatedData.pickup_date
    }

    // Handle pickup slot type
    if (validatedData.pickup_slot_type) {
      orderUpdateData.pickup_preference_slot_type = validatedData.pickup_slot_type
    }

    // Handle delivery date
    if (validatedData.delivery_date) {
      orderUpdateData.delivery_preference_date = validatedData.delivery_date
    }

    // Handle COD fields
    if (validatedData.is_cod !== undefined) {
      orderUpdateData.is_cod = validatedData.is_cod
      orderUpdateData.cod_amount = validatedData.is_cod ? validatedData.cod_amount : null
    }

    // Update InternationalOrder fields
    const intlUpdateData: any = {}
    const intlFields = [
      'shipper_company_name',
      'shipper_name',
      'shipper_address',
      'shipper_city',
      'shipper_city_id',
      'shipper_postal_code',
      'shipper_country',
      'shipper_country_id',
      'shipper_email',
      'shipper_phone',
      'shipper_tax_no',
      'recipient_company_name',
      'recipient_name',
      'recipient_address',
      'recipient_city',
      'recipient_city_id',
      'recipient_postal_code',
      'recipient_country',
      'recipient_country_id',
      'recipient_email',
      'recipient_phone',
      'recipient_tax_no',
      'description',
      'product_group',
      'product_type',
      'payment_type',
      'customs_value',
      'currency',
      'carrier',
    ]

    for (const field of intlFields) {
      if (validatedData[field as keyof typeof validatedData] !== undefined) {
        intlUpdateData[field] = validatedData[field as keyof typeof validatedData]
      }
    }

    if (validatedData.package_details) {
      const existingPackages = await order.related('order_package_list').query()

      // IDs of packages from request (if any)
      const incomingIds = validatedData.package_details
        .filter((p: any) => p.id)
        .map((p: any) => p.id)

      // Delete packages that were removed in request
      await order.related('order_package_list').query().whereNotIn('id', incomingIds).delete()

      for (const pkg of validatedData.package_details as any) {
        if (pkg.id) {
          // Existing package: update only modifiable fields
          const existing = existingPackages.find((p) => p.id === pkg.id)
          if (existing) {
            await existing
              .merge({
                package_type_id: pkg.package_type_id,
                weight: pkg.weight ?? 0,
                package_description: pkg.package_description ?? '',
                customer_input_package_value: pkg.customer_input_package_value ?? 0,
              })
              .save()
          }
        } else {
          // New package: generate new package ID
          const generatedOrderPackageId = await generatePackageId(
            order.created_for_id,
            order.total_no_of_packages,
            order_id
          )

          await order.related('order_package_list').create({
            ...pkg,
            customer_input_package_value: pkg?.customer_input_package_value ?? 0,
            status: PackageStatus.Open,
            generated_order_package_id: generatedOrderPackageId,
          })
        }
      }
      orderUpdateData.total_no_of_packages = validatedData.package_details.length
      orderUpdateData.total_weight = validatedData.package_details.reduce(
        (acc, item) => acc + (item.weight || 0),
        0
      )
      orderUpdateData.no_of_packages_remaining_to_pick = validatedData.package_details.length
    }

    if (validatedData.package_details) {
      //service_code
      let calculatedTotalShippingCharge: number = 0
      try {
        if (validatedData?.shipper_country && validatedData.recipient_country) {
          const destinationCountry = await MasterDataCountry.query()
            .where('name', validatedData.recipient_country)
            .first()

          const originCountry = await MasterDataCountry.query()
            .where('name', validatedData.shipper_country)
            .first()

          if (destinationCountry?.short_code && originCountry?.short_code) {
            validatedData.recipient_country = destinationCountry.short_code
            validatedData.shipper_country = originCountry.short_code
          }
        } else if (validatedData?.shipper_country_id && validatedData.recipient_country_id) {
          const destinationCountry = await MasterDataCountry.query()
            .where('id', validatedData.recipient_country_id)
            .first()

          const originCountry = await MasterDataCountry.query()
            .where('id', validatedData.shipper_country_id)
            .first()

          if (destinationCountry?.short_code && originCountry?.short_code) {
            validatedData.recipient_country = destinationCountry.short_code
            validatedData.shipper_country = originCountry.short_code
          }
        }
        const rateResult = await calculateShippingChargeWithMarkup(
          validatedData?.carrier ||
            order?.international_order_details?.carrier ||
            ShippingCarrier.Aramex,
          {
            originCity: validatedData.shipper_city || 'Manama',
            originCountry: validatedData.shipper_country || 'Bahrain',
            destinationCity: validatedData.recipient_city || '',
            destinationCountry: validatedData.recipient_country || 'Bahrain',
            weight: validatedData?.package_details.reduce(
              (acc: number, item: any) => acc + item.weight,
              0
            ),
            numberOfPieces: validatedData?.package_details?.length,
            productGroup: validatedData.product_group,
            productType: validatedData.product_type,
            originPostalCode:
              validatedData?.shipper_postal_code ?? validatedData?.shipper_postal_code ?? '',
            destinationPostalCode:
              validatedData.recipient_postal_code ?? validatedData?.recipient_postal_code ?? '',
            width: validatedData?.package_details.reduce(
              (acc: number, item: any) => acc + item.width,
              0
            ),
            height: validatedData?.package_details.reduce(
              (acc: number, item: any) => acc + item.height,
              0
            ),
            length: validatedData?.package_details.reduce(
              (acc: number, item: any) => acc + item.length,
              0
            ),
          },
          validatedData?.created_for_id ?? order?.created_for_id ?? null
        )
        const rateArray = normalizeRateResult(rateResult)
        const serviceCode: string | null =
          service_code ?? order?.international_order_details?.service_code
        const selectedRate = selectRateByServiceCode(rateArray, serviceCode)
        const serviceType = selectedRate?.serviceType ?? selectedRate?.service_code
        calculatedTotalShippingCharge = selectedRate.amount || 0
        courier_rate = selectedRate?.courier_rate || 0
        margin = selectedRate?.margin || 0
        if (
          (!serviceType &&
            validatedData?.recipient_postal_code &&
            validatedData?.shipper_postal_code) ||
          calculatedTotalShippingCharge <= 0
        ) {
          return response.badRequest({
            status: false,
            message: 'We do not currently service this postal code',
          })
        }
      } catch (error) {
        logger.error(error, 'Failed to calculate shipping rate during draft update')
        return response.badRequest({
          status: false,
          message: 'We do not currently service this postal code',
        })
        // if (error.message.toLowerCase().includes('Postcode')) {
        //   return response.badRequest({
        //     status: false,
        //     message: error.message,
        //   })
        // }
      }
      await InternationalOrder.query().where('order_id', order.id).update({
        service_code: service_code,
        courier_rate,
        margin,
      })
      if (typeof calculatedTotalShippingCharge === 'number') {
        orderUpdateData.calculated_total_shipping_charge = calculatedTotalShippingCharge
      }
    }

    await order
      .merge({
        ...orderUpdateData,
        pickup_block_id: pickupAddressData.block_id ?? undefined,
        pickup_road_id: pickupAddressData.road_id ?? undefined,
        pickup_building_id: pickupAddressData.building_id ?? undefined,
      })
      .save()

    await internationalOrder.merge(intlUpdateData).save()
    await order.refresh()
    await createComprehensiveOrderHistory(
      order.id,
      auth?.user?.id as number,
      OrderHistoryActions.Updated,
      {},
      `📝 International Order #${order.generated_order_id} was updated by ${auth?.user?.first_name} ${auth?.user?.last_name || ''}.`
    )

    return response.ok({
      status: true,
      message: 'International order updated successfully',
      data: order,
    })
  }

  async approveAndPlaceInternationalOrderByAdmin({ auth, request, response }: HttpContext) {
    const { order_id } = await request.validateUsing(
      approveAndPlaceInternationalOrderByAdminValidator
    )

    const order = await Order.query()
      .where('id', order_id)
      .where('order_type', OrderType.International)
      .where('status', OrderStatus.AtWarehouse)
      .preload('international_order_details', (q) => {
        q.preload('shipper_country_details')
        q.preload('shipper_city_details')
        q.preload('recipient_country_details')
        q.preload('recipient_city_details')
      })
      .preload('order_package_list')
      .firstOrFail()

    if (!order.international_order_details) {
      return response.badRequest({
        status: false,
        message: 'International order details not found',
      })
    }

    try {
      const carrier = order.international_order_details.carrier as ShippingCarrier
      const shippingProvider = ShippingFactory.getProvider(carrier)

      const shipmentResult = await shippingProvider.createShipment(
        order,
        order.international_order_details
      )

      order.status = OrderStatus.InTransit
      order.status_for_customer = OrderStatusForCustomer.InTransit
      await order.save()

      await order
        .related('international_order_details')
        .query()
        .update({
          courier_order_tracking_no: shipmentResult.trackingNumber,
          courier_order_barcode_url: shipmentResult.labelUrl,
          shipper_response: JSON.stringify(shipmentResult?.apiResponse ?? {}),
        })

      // Update Order Packages with Tracking Info
      for (const pkg of order.order_package_list) {
        pkg.status = PackageStatus.InTransit
        await pkg.save()
      }

      await createComprehensiveOrderHistory(
        order.id,
        auth?.user?.id as number,
        OrderHistoryActions.ApproveAndPlaceInternationalOrder,
        {},
        `✅ International Order #${order.generated_order_id} was approved and placed for shipment by ${auth?.user?.first_name} ${auth?.user?.last_name || ''}.`
      )

      await PublicTrack.create({
        order_id: order.id,
        status: PublicTrackStatus.InTransit,
        tracking_details: `✨ Your order is now In Transit.`,
      })

      return response.ok({
        status: true,
        message: 'Shipment created successfully',
        data: shipmentResult,
      })
    } catch (error) {
      logger.error(error, 'Failed to create shipment')
      return response.badRequest({
        status: false,
        message: 'Failed to create shipment: ' + error.message,
      })
    }
  }
}
