from sqlalchemy import ForeignKey, JSON, String
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.db.base import Base, TimestampMixin
from app.db.types import str_enum
from app.models.enums import ExtractionStatus


class ExtractionResult(Base, TimestampMixin):
    __tablename__ = "extraction_results"

    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    agency_id: Mapped[int | None] = mapped_column(ForeignKey("agencies.id"), index=True)
    uploaded_by: Mapped[int | None] = mapped_column(ForeignKey("users.id"))
    policy_id: Mapped[int | None] = mapped_column(ForeignKey("policies.id"), index=True)
    insurance_company_id: Mapped[int | None] = mapped_column(ForeignKey("insurance_companies.id"))
    original_filename: Mapped[str] = mapped_column(String(255), nullable=False)
    file_checksum: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
    status: Mapped[ExtractionStatus] = mapped_column(str_enum(ExtractionStatus), nullable=False)
    raw_data: Mapped[dict | None] = mapped_column(JSON)
    storage_path: Mapped[str | None] = mapped_column(String(500))

    policy: Mapped["Policy | None"] = relationship(back_populates="extraction_results")
    parser_corrections: Mapped[list["ParserCorrection"]] = relationship(back_populates="extraction")
    parser_training_examples: Mapped[list["ParserTrainingExample"]] = relationship(back_populates="extraction")


from app.models.policy import Policy  # noqa: E402
