import WebhookStatus from '#models/webhook_status'
import { TransactionClientContract } from '@adonisjs/lucid/types/database'
import { WebhookEventType } from '../../types/enum.js'

export const WebhookHelper = async ({
  orderGeneratedId,
  webhookEventType,
  trackingStatus,
  remarks,
  trx,
}: {
  orderGeneratedId: string
  webhookEventType: WebhookEventType
  trackingStatus?: string
  remarks?: string
  trx?: TransactionClientContract
}) => {
  switch (webhookEventType) {
    case WebhookEventType.Open: //done
      await WebhookStatus.create(
        {
          awb_number: orderGeneratedId,
          tracking_status: 'Placed',
          remarks: 'Order created and is pending for pickup',
          webhook_event_type: WebhookEventType.Open,
        },
        { client: trx }
      )
      break
    case WebhookEventType.PendingPickup: //done
      await WebhookStatus.create(
        {
          awb_number: orderGeneratedId,
          tracking_status: 'Placed',
          remarks: 'Order created and is pending for pickup',
          webhook_event_type: WebhookEventType.PendingPickup,
        },
        { client: trx }
      )
      break
    case WebhookEventType.PickupException: //done
      await WebhookStatus.create(
        {
          awb_number: orderGeneratedId,
          tracking_status: trackingStatus || 'Pickup Failed',
          remarks: remarks || 'There is an exception in pickup',
          webhook_event_type: WebhookEventType.PickupException,
        },
        { client: trx }
      )
      break
    case WebhookEventType.PickupCancelled: //done
      await WebhookStatus.create(
        {
          awb_number: orderGeneratedId,
          tracking_status: 'Pickup Cancelled',
          remarks: 'Pickup has been cancelled',
          webhook_event_type: WebhookEventType.PickupCancelled,
        },
        { client: trx }
      )
      break
    case WebhookEventType.PickedUp: //done
      await WebhookStatus.create(
        {
          awb_number: orderGeneratedId,
          tracking_status: 'Picked',
          remarks: 'Order has been picked up',
          webhook_event_type: WebhookEventType.PickedUp,
        },
        { client: trx }
      )
      break
    case WebhookEventType.InTransit: //done
      await WebhookStatus.create(
        {
          awb_number: orderGeneratedId,
          tracking_status: 'Warehouse',
          remarks: 'Order is in warehouse and is being processed for delivery',
          webhook_event_type: WebhookEventType.InTransit,
        },
        { client: trx }
      )
      break
    case WebhookEventType.OutForDelivery: //done
      await WebhookStatus.create(
        {
          awb_number: orderGeneratedId,
          tracking_status: 'Out for delivery',
          remarks: 'Order is out for delivery',
          webhook_event_type: WebhookEventType.OutForDelivery,
        },
        { client: trx }
      )
      break
    case WebhookEventType.ReattemptDeliveryScheduled:
      await WebhookStatus.create(
        {
          awb_number: orderGeneratedId,
          tracking_status: 'Reattempt Delivery Scheduled',
          remarks: 'Reattempt delivery has been scheduled',
          webhook_event_type: WebhookEventType.ReattemptDeliveryScheduled,
        },
        { client: trx }
      )
      break
    case WebhookEventType.Delivered: //done
      await WebhookStatus.create(
        {
          awb_number: orderGeneratedId,
          tracking_status: 'Delivered',
          remarks: 'Order has been delivered',
          webhook_event_type: WebhookEventType.Delivered,
        },
        { client: trx }
      )
      break
    case WebhookEventType.Exception: //done
      await WebhookStatus.create(
        {
          awb_number: orderGeneratedId,
          tracking_status: 'Exception',
          remarks: remarks || 'There is an exception in delivery',
          webhook_event_type: WebhookEventType.Exception,
        },
        { client: trx }
      )
      break
    case WebhookEventType.Cancelled:
      await WebhookStatus.create(
        {
          awb_number: orderGeneratedId,
          tracking_status: 'Cancelled',
          remarks: 'Order has been cancelled',
          webhook_event_type: WebhookEventType.Cancelled,
        },
        { client: trx }
      )
      break
    default:
      break
  }
}
