import refreshTokenHelper from "../../../../utils/refreshTokenHelper"
import getTokenHelper from "../../../../utils/getTokenHelper"
import forceLogoutHelper from "../../../../utils/forceLogoutHelper"
import errorHandlingHelper from "../../../../utils/errorHandlingHelper"
import {
  LINE_SELECT_WITH_STATEMENT,
  fetchLinesForStatements,
  parseIdList,
  presentStatementLine
} from "../../../../utils/bankReconciliation"

// GET /api/accounting/bank-reconciliation/lines?ids=1,2,3
// All lines of MANY statements (the "Alle Auszüge" default view of the
// reconcile tab). Each line carries its statement header so the table can show
// / sort / search by document number. Per-statement progress is returned too,
// so the statement list can show "3/12" without a second round-trip.
const handleFunc = async (event: any, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)
  const ids = parseIdList(getQuery(event).ids)

  if (!ids.length) {
    return { status: 200, lines: [], statements: {}, total: 0, matchedCount: 0 }
  }

  const records = await fetchLinesForStatements(event, token, ids, LINE_SELECT_WITH_STATEMENT)

  const statements: Record<number, any> = {}
  const lines = records.map((rec: any) => {
    const st = rec.C_BankStatement_ID || {}
    const statementId = Number(st.id) || 0
    if (statementId && !statements[statementId]) {
      statements[statementId] = {
        id: statementId,
        documentNo: st.DocumentNo || st.identifier || '',
        name: st.Name || '',
        statementDate: st.StatementDate || '',
        docStatus: st.DocStatus?.id || st.DocStatus || '',
        total: 0,
        matchedCount: 0
      }
    }
    const line = presentStatementLine(rec)
    if (statementId) {
      statements[statementId].total++
      if (line.matched) statements[statementId].matchedCount++
    }
    return {
      ...line,
      statementId,
      statementDocNo: statements[statementId]?.documentNo || '',
      statementDate: statements[statementId]?.statementDate || '',
      statementDocStatus: statements[statementId]?.docStatus || ''
    }
  })

  const matchedCount = lines.filter((l: any) => l.matched).length

  return { status: 200, lines, statements, total: lines.length, matchedCount }
}

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