from sqlalchemy import Column, String, DateTime, Text, Index
from blood_db import Base

class EpicObservationBlood(Base):
    __tablename__ = "epic_observations"

    org_id = Column(String(64), nullable=False, index=True)
    fhir_id = Column(String(128), nullable=False)
    patient_id = Column(String(128), nullable=False)
    # FHIR Observation.id
    observation_id = Column(String(255), primary_key=True)

    # Common references (store just the referenced ids if you want; here we store full "Patient/xxx")
    patient_reference = Column(String(255), index=True)      # e.g. "Patient/eUEKdn..."
    encounter_reference = Column(String(255), index=True)    # e.g. "Encounter/eKvk..."
    specimen_reference = Column(String(255), index=True)     # e.g. "Specimen/..."

    status = Column(String(64), index=True)                  # final, amended, etc.

    # "code" summary
    code_text = Column(String(512), index=True)              # resource.code.text
    code_primary_system = Column(String(255), index=True)    # e.g. "http://loinc.org"
    code_primary_code = Column(String(128), index=True)      # e.g. "94500-6"
    code_primary_display = Column(String(512))               # display text

    # Timing
    effective_datetime = Column(DateTime(timezone=True), index=True)
    issued_datetime = Column(DateTime(timezone=True), index=True)

    # Value (support common value[x] shapes)
    value_type = Column(String(64), index=True)              # "valueString", "valueCodeableConcept", ...
    value_string = Column(String(2048))
    value_code = Column(String(128))
    value_system = Column(String(255))
    value_display = Column(String(512))
    value_unit = Column(String(64))
    value_number = Column(String(64))                        # store numeric as string for portability

    # Other FHIR elements (store as JSON string blobs to avoid many join tables)
    category_json = Column(Text)                             # list of category codings/text
    interpretation_json = Column(Text)                       # list
    note_json = Column(Text)                                 # list
    has_member_json = Column(Text)                           # list of references
    based_on_json = Column(Text)                             # list of references
    reference_range_json = Column(Text)                      # list

    # Full raw resource (always keep this)
    raw_json = Column(Text)

    __table_args__ = (
        Index("ix_obs_patient_effective", "patient_reference", "effective_datetime"),
        Index("ix_obs_code", "code_primary_system", "code_primary_code"),
    )
