import {
  AdminFulfillmentItem,
  AdminFulfillmentLabel,
  AdminOrder,
  AdminOrderFulfillment,
  AdminPayment,
  AdminPaymentCollection,
  AdminRefund,
  AdminRefundReason,
} from "@medusajs/types"

const DEFAULT_PROPERTIES = [
  "id",
  "status",
  "created_at",
  "canceled_at",
  "email",
  "display_id",
  "custom_display_id",
  "currency_code",
  "metadata",
  // --- TOTALS ---
  "total",
  "credit_line_total",
  "item_subtotal",
  "item_total",
  "item_tax_total",
  "original_item_tax_total",
  "item_discount_total",
  "shipping_subtotal",
  "original_total",
  "original_tax_total",
  "subtotal",
  "discount_total",
  "discount_subtotal",
  "shipping_total",
  "shipping_tax_total",
  "original_shipping_tax_total",
  "shipping_discount_total",
  "tax_total",
  "refundable_total",
  "order_change",
]

const DEFAULT_RELATIONS = [
  "*customer",
  "*items", // -> we get LineItem here with added `quantity` and `detail` which is actually an OrderItem (which is a parent object to LineItem in the DB)
  "*items.variant",
  "*items.variant.product",
  "*items.variant.options",
  "+items.variant.manage_inventory",
  "*items.variant.inventory_items.inventory",
  "+items.variant.inventory_items.required_quantity",
  "+summary",
  "*shipping_address",
  "*billing_address",
  "*sales_channel",
  "*promotions",
  "*shipping_methods",
  "*credit_lines",
  "*fulfillments",
  "+fulfillments.shipping_option.service_zone.fulfillment_set.type",
  "*fulfillments.items",
  "*fulfillments.labels",
  "*fulfillments.labels",
  "*payment_collections",
  "*payment_collections.payment_sessions",
  "*payment_collections.payments",
  "*payment_collections.payments.refunds",
  "*payment_collections.payments.refunds.refund_reason",
  "region.automatic_taxes",
]

export const DEFAULT_FIELDS = `${DEFAULT_PROPERTIES.join(
  ","
)},${DEFAULT_RELATIONS.join(",")}`

export type ExtendedOrderFulfillment = AdminOrderFulfillment & {
  items: AdminFulfillmentItem[]
  labels: AdminFulfillmentLabel[]
  shipping_option?: {
    service_zone?: {
      fulfillment_set?: {
        type: string
      }
    }
  }
}

export type ExtendedRefund = AdminRefund & {
  payment_id: string | null
  refund_reason: AdminRefundReason
}

export type ExtendedOrder = Omit<AdminOrder, "fulfillments"> & {
  fulfillments?: ExtendedOrderFulfillment[]
  no_notification?: boolean
  canceled_at?: string | null
  display_id: string
  payment_collection?: AdminPaymentCollection & {
    payments: (AdminPayment & {
      refunds: ExtendedRefund[]
    })[]
  }
}
