from sqlalchemy import ForeignKey, Integer, JSON, String, Text
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.db.base import Base, TimestampMixin


class ParserTrainingExample(Base, TimestampMixin):
    __tablename__ = "parser_training_examples"

    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    extraction_id: Mapped[int] = mapped_column(ForeignKey("extraction_results.id"), index=True)
    agency_id: Mapped[int] = mapped_column(ForeignKey("agencies.id"), index=True)
    created_by: Mapped[int] = mapped_column(ForeignKey("users.id"))
    company_code: Mapped[str] = mapped_column(String(50), index=True)
    field_name: Mapped[str] = mapped_column(String(50))
    page: Mapped[int] = mapped_column(Integer, default=1)
    value: Mapped[str] = mapped_column(Text)
    anchor_before: Mapped[str | None] = mapped_column(Text)
    anchor_after: Mapped[str | None] = mapped_column(Text)
    snippet: Mapped[str | None] = mapped_column(Text)
    selection_start: Mapped[int | None] = mapped_column(Integer)
    selection_end: Mapped[int | None] = mapped_column(Integer)
    bbox: Mapped[dict | None] = mapped_column(JSON)
    notes: Mapped[str | None] = mapped_column(Text)

    extraction: Mapped["ExtractionResult"] = relationship(back_populates="parser_training_examples")
    patterns: Mapped[list["ParserPattern"]] = relationship(back_populates="source_training_example")
