import refreshTokenHelper from "../../../utils/refreshTokenHelper"
import getTokenHelper from "../../../utils/getTokenHelper"
import forceLogoutHelper from "../../../utils/forceLogoutHelper"
import errorHandlingHelper from "../../../utils/errorHandlingHelper"
import { isValidToken, loadUpload, planAccount, presentPlan } from "../../../utils/banking/bankFileImport"

// POST /api/accounting/bank-file-import/replan
// Body: { token, iban, bankAccountId }
// Re-runs the dry-run plan of ONE account of a parked upload against a bank
// account the user picked manually (file IBAN unknown to iDempiere, e.g. after
// a bank merger changed the IBAN). Writes nothing; returns the same shape as
// one entry of preview's `accounts`.
const handleFunc = async (event: any, account: any, bankAccountId: number, authToken: any = null) => {
  const token = authToken ?? await getTokenHelper(event)
  const plan = await planAccount(event, token, account, null, bankAccountId)
  if (!plan.bankAccount) return { status: 404, message: `Bankkonto ${bankAccountId} nicht gefunden oder inaktiv` }
  return { status: 200, account: presentPlan(plan) }
}

export default defineEventHandler(async (event) => {
  const body = await readBody(event)
  const uploadToken = String(body?.token || '')
  if (!isValidToken(uploadToken)) return { status: 400, message: 'Ungültiges Upload-Token' }

  const parsed = await loadUpload(uploadToken)
  if (!parsed) return { status: 404, message: 'Upload nicht mehr vorhanden — bitte die Datei erneut hochladen' }

  const iban = String(body?.iban || '').replace(/\s+/g, '').toUpperCase()
  const account = parsed.accounts.find((acc: any) => acc.iban === iban)
  if (!account) return { status: 404, message: 'Konto nicht im Upload enthalten' }

  const bankAccountId = Number(body?.bankAccountId || 0)
  if (!bankAccountId) return { status: 400, message: 'Kein Bankkonto gewählt' }

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