//
//  Copyright 2026 The InfiniFlow Authors. All Rights Reserved.
//
//  Licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the License.
//  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//

// ParseResult is the structured output contract for the Go parser
// library. Port-rag-flow-pipeline-to-go.md §6.5 mandates that
// parsers surface enough data to reconstruct a Python-compatible
// stage-boundary payload:
//
//	output_format ∈ {"json","markdown","text","html"}
//	file         (enriched metadata)
//	exactly one payload family populated (matching output_format)
//	err
//
// Go parser callers now consume only the structured ParseResult
// contract. The legacy `Parse(filename, []byte) error` interface has
// been removed so parser dispatch, ingestion, and service paths all
// share the same typed payload contract.

package parser

import "context"

// ParseResult is the structured return value of a successful parse.
// Exactly one of the payload fields (JSON / Markdown / Text / HTML)
// is populated on success, matching the Python contract — see
// port-rag-flow-pipeline-to-go.md §4.2:
//
//   - OutputFormat = "json"     → JSON populated
//   - OutputFormat = "markdown" → Markdown populated
//   - OutputFormat = "text"     → Text populated
//   - OutputFormat = "html"     → HTML populated
//
// On failure (Err != nil), all payload fields are zero values and
// OutputFormat is empty.
type ParseResult struct {
	// OutputFormat is the wire-compatible format the parser
	// chose. Empty when Err is non-nil.
	OutputFormat string

	// File is the enriched file metadata the parser emits. In
	// Python this is the dict form of the original `file`
	// descriptor, augmented with format-specific keys (e.g.
	// `outline` on the PDF path, `page_count` for paginated
	// formats). Nil when the parser did not enrich.
	File map[string]any

	// JSON is the structured payload when OutputFormat == "json".
	// Shape depends on the parser family: PDF emits
	// `[]map[string]any` with `text` + `doc_type_kwd` keys (and
	// optional `image` / `layout` / `positions` fields);
	// markdown / html / text emit normalized
	// `{text, doc_type_kwd}` items; image emits OCR/VLM result
	// items. Exactly one payload family is populated on success.
	JSON []map[string]any

	// Markdown is the string payload when OutputFormat ==
	// "markdown". Empty otherwise.
	Markdown string

	// Text is the string payload when OutputFormat == "text".
	// Empty otherwise.
	Text string

	// HTML is the string payload when OutputFormat == "html".
	// Empty otherwise.
	HTML string

	// Err is the failure reason. On non-nil Err, all payload
	// fields are zero values.
	Err error
}

// ParseResultProducer is the parser package's single structured-output
// contract. Every parser returned by GetParser must implement it.
type ParseResultProducer interface {
	ParseWithResult(ctx context.Context, filename string, data []byte) ParseResult
}
