// useLibs
// noPage

import { EventConfigProperty } from "esoftplay/cache/event/config/import"
import { LibCurl } from "esoftplay/cache/lib/curl/import"
import { LibNavigation } from "esoftplay/cache/lib/navigation/import"
import { LibToastProperty } from "esoftplay/cache/lib/toast/import"
import esp from "esoftplay/esp"
import useGlobalState from "esoftplay/global"


export interface EventCheckout {
  doPayment: (eventData: any, ticketSelected: any, qty: number, subscribed: any) => void,
  curlPriceConfig: (url: string, price_id: string) => Promise<any>
}

export const loading = useGlobalState<boolean>(false)

export default function m(): EventCheckout {
  async function proceedToPayment(eventData: any, ticketSelected: any, qty: number, subscribed: any) {
    if (!ticketSelected) {
      LibToastProperty.show(esp.lang("event/artist_detail", "select_tiket_first"))
      return
    }

    const event_id = eventData?.event_id || eventData?.id
    let dataPost: any = {
      event_id: event_id,
      event_title: eventData?.event_title || eventData?.title,
      charge_payment: eventData?.charge_payment,
      charge_payment_type: eventData?.charge_payment_type,
      selected_ticket: ticketSelected,
      qty: qty,
    }

    if (ticketSelected?.config?.seat_autopick == 1 && qty > 1) {
      dataPost.adjacent_seats = 1
    }

    let finalDataPost = { ...dataPost }

    if (ticketSelected?.use_seat == 1) {
      if (ticketSelected?.config?.seat_autopick != 1) {
        const seat = await LibNavigation.navigateForResult('event/seat_map_new', {
          url: 'event_seat',
          dataTicket: finalDataPost,
        })

        finalDataPost = {
          ...finalDataPost,
          seat_label: seat?.seat_label
        }
      }
    }


    finalDataPost = await handleAdditionIfNeeded(event_id, ticketSelected, finalDataPost, qty)
    const args = await buildPaymentArgs(eventData, ticketSelected, finalDataPost, qty, subscribed)
    LibNavigation.navigate('payment/ticket', args)
  }

  function curlPriceConfig(url: string, price_id: string): Promise<any> {
    return new Promise((resolve) => {
      if (!url) {
        resolve({})
        return
      }

      new LibCurl(
        url,
        null,
        (res) => {
          resolve(res?.[price_id] || {})
        },
        (err) => {
          LibToastProperty.show(err?.message)
          resolve({})
        }
      )
    })
  }

  async function buildPaymentArgs(data: any, selectedTicket: any, dataPost: any, qty: number, subscribed: any) {
    const eventConfig = EventConfigProperty.state().get()
    loading.set(true)
    const conf = await curlPriceConfig(data?.url_price_config, selectedTicket?.price_id)
    loading.set(false)

    return {
      order_type: eventConfig?.order_type?.ticket,
      tax: conf?.tax ?? selectedTicket?.tax ?? data?.tax ?? 0,
      dataBookingEvent: { ...dataPost, qty },
      subscribed,
      fee_platform: conf?.fee_platform_amount != null
        ? {
          fee_platform_amount: conf.fee_platform_amount || 0,
          fee_platform_type: conf.fee_platform_type || "NONE",
        }
        : {
          fee_platform_amount: data?.fee_platform_amount || 0,
          fee_platform_type: data?.fee_platform_type || "NONE",
        },
      fee_custom: {
        fee_custom_label: conf?.fee_custom_label || "Custom Fee",
        fee_custom_amount: conf?.fee_custom_amount,
        fee_custom_type: conf?.fee_custom_type,
      }
    }
  }

  async function handleAdditionIfNeeded(event_id: string, selectedTicket: any, dataPost: any, qty: number) {
    if (selectedTicket?.has_addition != 1) return dataPost

    const additions = await LibNavigation.navigateForResult(
      'event/additional',
      {
        type_ticket: selectedTicket?.type,
        ondate: selectedTicket?.list?.ondate,
        event_id: event_id,
        qty,
        data: dataPost,
        price_id: selectedTicket?.price_id
      },
      221
    )

    return additions ? { ...dataPost, addition: additions } : dataPost
  }

  return {
    doPayment: proceedToPayment,
    curlPriceConfig
  }

}