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/statements?status=DR|CO
// Drafted statements (default) or recently completed ones for the archive
// toggle — across ALL bank accounts (Volksbank/EBICS, PayPal, …). Both NEWEST
// FIRST (StatementDate desc, id desc) — every list on the Banking page reads
// latest → oldest.
const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)
  const query = getQuery(event)
  const status = query.status === 'CO' ? 'CO' : 'DR'

  let filter = `DocStatus eq '${status}'`
  if (status === 'CO') {
    const since = new Date()
    since.setDate(since.getDate() - 30)
    filter += ` and StatementDate ge ${since.toISOString().slice(0, 10)}`
  }

  const res: any = await event.context.fetch(
    `models/c_bankstatement?$filter=${string.urlEncode(filter)}` +
    `&$select=C_BankStatement_ID,DocumentNo,Name,StatementDate,BeginningBalance,EndingBalance,DocStatus,EftStatementReference,C_BankAccount_ID` +
    `&$expand=${string.urlEncode('C_BankAccount_ID($select=Name,AccountNo)')}` +
    `&$orderby=${string.urlEncode('StatementDate desc,C_BankStatement_ID desc')}&$top=100`,
    'GET', token, null
  )

  const statements = (res?.records || []).map((s: any) => ({
    id: s.id,
    documentNo: s.DocumentNo || '',
    name: s.Name || '',
    statementDate: s.StatementDate || '',
    beginningBalance: s.BeginningBalance ?? null,
    endingBalance: s.EndingBalance ?? null,
    docStatus: s.DocStatus?.id || s.DocStatus || status,
    eftReference: s.EftStatementReference || '',
    bankAccountId: s.C_BankAccount_ID?.id || null,
    bankAccountName: s.C_BankAccount_ID?.Name || s.C_BankAccount_ID?.identifier || ''
  }))

  return { status: 200, statements }
}

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
})
