import pytest

from semantica.export.lpg_exporter import LPGExporter
from semantica.export.owl_exporter import OWLExporter
from semantica.export.rdf_exporter import RDFExporter


@pytest.mark.benchmark(group="semantic_serialization")
@pytest.mark.parametrize("format", ["turtle", "rdfxml"])
def test_rdf_serialization_formats(benchmark, generate_knowledge_graph, format):
    kg = generate_knowledge_graph(1000)
    exporter = RDFExporter()
    rdf_data = exporter.serializer.convert_kg_to_rdf(kg)

    def run():
        return exporter.export_to_rdf(rdf_data, format=format)

    benchmark.pedantic(run, iterations=1, rounds=5)


@pytest.mark.benchmark(group="graph_db_export")
def test_lpg_cypher_generation(benchmark, generate_knowledge_graph):
    kg = generate_knowledge_graph(2000)
    exporter = LPGExporter(batch_size=1000, include_indexes=False)

    def run():
        return exporter._generate_cypher_queries(kg)

    benchmark.pedantic(run, iterations=1, rounds=5)


@pytest.mark.benchmark(group="semantic_serialization")
def test_owl_xml_generation(benchmark, tmp_path):
    ontology = {
        "name": "BenchmarkOntology",
        "classes": [{"name": f"Class{i}"} for i in range(500)],
        "object_properties": [{"name": f"Prop{i}"} for i in range(200)],
    }
    exporter = OWLExporter()
    output_file = tmp_path / "ontology.xml"

    def run():
        exporter.export(ontology, output_file, format="owl-xml")

    benchmark.pedantic(run, iterations=1, rounds=5)
