import { string } from 'alga-js'
import refreshTokenHelper from "../../../utils/refreshTokenHelper"
import getTokenHelper from "../../../utils/getTokenHelper"
import forceLogoutHelper from "../../../utils/forceLogoutHelper"
import errorHandlingHelper from "../../../utils/errorHandlingHelper"

// GET /api/accounting/bank-reconciliation/unreconciled-payments?bankAccountId=|statementId=
// Completed, not-yet-reconciled payments — candidates for "Zahlung verknüpfen"
// (existing AP payments, recovery after a failed link). Optionally scoped to
// one bank account — either directly (bankAccountId) or derived from the
// statement being reconciled (statementId, passed by the match modal).
const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)
  const query = getQuery(event)
  let bankAccountId = Number(query.bankAccountId || 0)
  const statementId = Number(query.statementId || 0)
  if (!bankAccountId && statementId > 0) {
    const st: any = await event.context.fetch(
      `models/c_bankstatement/${statementId}?$select=C_BankAccount_ID`, 'GET', token, null
    )
    bankAccountId = st?.C_BankAccount_ID?.id || 0
  }

  let filter = `IsReconciled eq 'N' and DocStatus eq 'CO'`
  if (bankAccountId > 0) {
    filter += ` and C_BankAccount_ID eq ${bankAccountId}`
  }
  const res: any = await event.context.fetch(
    `models/c_payment?$filter=${string.urlEncode(filter)}` +
    `&$select=C_Payment_ID,DocumentNo,PayAmt,DateTrx,IsReceipt,C_BPartner_ID,Description,C_BankAccount_ID` +
    `&$expand=C_BPartner_ID($select=Name)` +
    `&$orderby=${string.urlEncode('DateTrx desc')}&$top=200`,
    'GET', token, null
  )

  const payments = (res?.records || []).map((p: any) => ({
    id: p.id,
    documentNo: p.DocumentNo || '',
    payAmt: p.PayAmt ?? 0,
    dateTrx: p.DateTrx || '',
    isReceipt: !!p.IsReceipt,
    partnerName: p.C_BPartner_ID?.Name || p.C_BPartner_ID?.identifier || '',
    description: p.Description || '',
    bankAccountId: p.C_BankAccount_ID?.id || null
  }))

  return { status: 200, payments }
}

export default defineEventHandler(async (event) => {
  let data: any = {}

  try {
    data = await handleFunc(event)
  } catch (err: any) {
    try {
      let authToken: any = await refreshTokenHelper(event)
      data = await handleFunc(event, authToken)
    } catch (error) {
      data = errorHandlingHelper(err?.data ?? err, error?.data ?? error)
      forceLogoutHelper(event, data)
    }
  }

  return data
})
