"""can four marsh stations support a paired analysis?

Generated from src/content/docs/reference/missingness.md.
Run with the documented Fieldwork release in a writable directory.
Exports are saved there using the filenames shown in the walkthrough.
"""

import pandas as pd
import fieldwork as fw

visits = pd.DataFrame(
    [
        ("Alder", "A01", "spring", 11.2, 12.1, 140),
        ("Alder", "A02", "spring", 11.8, 12.4, None),
        ("Alder", "A03", "fall", 9.8, 12.7, "NOT_RUN"),
        ("Alder", "A04", "fall", 10.3, -999, 170),
        ("Birch", "B01", "spring", 6.0, 8.1, 96),
        ("Birch", "B02", "spring", 5.7, 7.9, "NOT_RUN"),
        ("Birch", "B03", "fall", 5.1, 8.5, "NOT_RUN"),
        ("Cedar", "C01", "spring", 4.2, 5.6, None),
        ("Cedar", "C02", "fall", None, 6.0, 78),
        ("Dogwood", "D01", "spring", 2.5, 3.2, 35),
        ("Dogwood", "D02", "spring", 2.9, 3.4, "NOT_RUN"),
        ("Dogwood", "D03", "fall", -999, 3.6, 41),
    ],
    columns=[
        "station",
        "visit",
        "season",
        "stage_cm",
        "salinity_psu",
        "edna_copies",
    ],
)
features = ["stage_cm", "salinity_psu", "edna_copies"]
sentinels = {
    "stage_cm": [-999],
    "salinity_psu": [-999],
    "edna_copies": ["NOT_RUN"],
}

raw = fw.missingness(visits, features=features)
rows = fw.missingness(
    visits,
    features=features,
    by=["season"],
    missing=sentinels,
    table_id="marsh_visits",
)
coverage = rows.to_frame("availability")
print(
    coverage[
        ["feature", "populated", "missing", "denominator"]
    ].to_string(index=False)
)
print(
    "Without sentinel rules:",
    [item["populated"] for item in raw["availability"]],
)

for context in rows["contexts"]:
    season = context["values"]["season"]
    availability = pd.DataFrame(context["availability"])
    edna = availability[availability["feature"] == "edna_copies"]
    print(season)
    print(
        edna[["feature", "populated", "denominator"]].to_string(
            index=False
        )
    )

any_visit = fw.missingness(
    visits,
    features=features,
    entity="station",
    unit="entities",
    entity_presence="any",
    missing=sentinels,
)
every_visit = fw.missingness(
    visits,
    features=features,
    entity="station",
    unit="entities",
    entity_presence="all",
    missing=sentinels,
)
columns = ["feature", "populated", "denominator"]
print("At least one visit:")
print(
    any_visit.to_frame("availability")[columns].to_string(index=False)
)
print("Every visit:")
print(
    every_visit.to_frame("availability")[columns].to_string(index=False)
)

signatures = rows.to_frame("signatures")
print(
    signatures[["finding_id", "present", "absent", "count"]].to_string(
        index=False
    )
)

complete_visits = rows.inspect(visits, "f4", all_matches=True)
print(complete_visits[["station", "visit"]].to_string(index=False))

findings = rows.to_frame("findings")
implications = findings[findings["pattern"] == "presence_implication"]
print(implications[["id", "statement"]].to_string(index=False))

exceptions = rows.inspect(
    visits, "f7", exceptions=True, all_matches=True
)
print(
    exceptions[
        ["station", "visit", "stage_cm", "salinity_psu"]
    ].to_string(index=False)
)

repair_scope = rows.select(
    visits, "f7", exceptions=True, name="Check salinity log"
)

print(fw.render_plaintext(rows, width=120, max_nodes=1))
