package com.dano.test1.data

import android.content.Context
import android.util.Log
import android.widget.Toast
import com.dano.test1.LanguageManager
import org.apache.poi.ss.usermodel.CellType
import org.apache.poi.ss.usermodel.DateUtil
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import org.json.JSONArray
import java.nio.charset.Charset

/*
Zweck:
- Liefert die Reihenfolge/IDs der zu exportierenden Header (Spalten) für den Excel-Export.
- Bevorzugte Quelle ist eine Excel-Datei aus den App-Assets („header_order.xlsx“), als Fallback wird eine JSON-Datei („header_order.json“) genutzt.

*/
class HeaderOrderRepository(
    private val context: Context,
    // Sprache abrufen (Standard: Deutsch, damit es ohne OpeningScreen schon sinnvoll ist)
    private val languageIDProvider: () -> String = { "GERMAN" }
) {

    private val tag = "HeaderOrderRepository"
    private var orderedIdsCache: List<String>? = null

    private fun t(key: String): String = LanguageManager.getText(languageIDProvider(), key)

    fun loadOrderedIds(): List<String> {
        orderedIdsCache?.let { return it }

        val fromXlsx = runCatching { loadOrderedIdsFromExcel("header_order.xlsx") }
            .onFailure { e -> Log.w(tag, "header_order.xlsx konnte nicht gelesen werden: ${e.message}") }
            .getOrElse { emptyList() }

        if (fromXlsx.isNotEmpty()) {
            orderedIdsCache = fromXlsx
            return fromXlsx
        }

        return try {
            val stream = context.assets.open("header_order.json")
            val json = stream.readBytes().toString(Charset.forName("UTF-8"))
            val arr = JSONArray(json)
            val list = MutableList(arr.length()) { i -> arr.getString(i) }
            orderedIdsCache = list
            list
        } catch (e: Exception) {
            Log.e(tag, "Weder header_order.xlsx noch header_order.json verfügbar/gültig: ${e.message}")
            Toast.makeText(context, t("no_header_template_found"), Toast.LENGTH_LONG).show()
            emptyList()
        }
    }

    private fun loadOrderedIdsFromExcel(assetFileName: String): List<String> {
        context.assets.open(assetFileName).use { input ->
            XSSFWorkbook(input).use { wb ->
                val sheet = wb.getSheetAt(0) ?: return emptyList()
                val row = sheet.getRow(0) ?: return emptyList()

                val first = row.firstCellNum.toInt()
                val last = row.lastCellNum.toInt()  // exklusiv
                val out = mutableListOf<String>()

                for (i in first until last) {
                    val cell = row.getCell(i) ?: continue
                    val value = when (cell.cellType) {
                        CellType.STRING   -> cell.stringCellValue
                        CellType.NUMERIC  ->
                            if (DateUtil.isCellDateFormatted(cell))
                                cell.dateCellValue.time.toString()
                            else {
                                val n = cell.numericCellValue
                                if (n % 1.0 == 0.0) n.toLong().toString() else n.toString()
                            }
                        CellType.BOOLEAN  -> cell.booleanCellValue.toString()
                        CellType.FORMULA  -> cell.richStringCellValue.string
                        else                                          -> ""
                    }.trim()

                    if (value.isEmpty()) continue
                    if (i == first && value == "#") continue // „#“ in Spalte 0 ignorieren
                    out.add(value)
                }
                return out
            }
        }
    }
}
