/*
 * Episteme Reader - A native Android document reader.
 * Copyright (C) 2026 Episteme
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 * mail: epistemereader@gmail.com
 */
package com.aryan.reader.epub

import org.jsoup.Jsoup
import org.jsoup.nodes.Document

/**
 * Parses an XML/HTML file from an EPUB archive, primarily to extract a title
 * and determine the effective path for WebView (including fragments).
 *
 * @property fileRelativePath The relative path of the HTML file within the EPUB's extraction directory.
 * @property data The raw data (content) of the HTML file.
 * @property fragmentId Optional ID of the fragment to link to within the HTML file.
 */
class EpubXMLFileParser(
    val fileRelativePath: String, // e.g., "OEBPS/chapter1.xhtml"
    val data: ByteArray,
    private val fragmentId: String? = null
) {

    companion object {
        private const val TAG = "EpubXMLFileParser"
    }

    /**
     * Represents the output of the parsing.
     *
     * @property title The extracted title of the HTML document (e.g., from h1-h6 tags).
     * @property effectiveHtmlPath The relative path to the HTML file, including any fragment identifier.
     *                             This path is relative to the book's extraction base.
     */
    data class Output(val title: String?, val effectiveHtmlPath: String)

    /**
     * Parses the HTML data to extract a title and construct the effective HTML path.
     *
     * @return [Output] The title and effective HTML path.
     */
    fun parseForTitleAndPath(): Output {
        val document = Jsoup.parse(data.inputStream(), "UTF-8", "")
        return parseForTitleAndPath(document)
    }

    /**
     * Overload to use an existing Document to avoid double parsing.
     */
    fun parseForTitleAndPath(document: Document): Output {

        val extractedTitle = document.selectFirst("h1, h2, h3, h4, h5, h6")?.text()?.trim()

        val pathWithFragment = if (fragmentId != null) {
            "$fileRelativePath#$fragmentId"
        } else {
            fileRelativePath
        }

        return Output(
            title = extractedTitle,
            effectiveHtmlPath = pathWithFragment
        )
    }
}