import pandas as pd
from semopy import Model, calc_stats

dane = pd.read_csv("dane_walidacja_skali.csv")

model_opis = """
samoregulacja =~ s1 + s2 + s3 + s4 + s5 + s6
motywacja =~ m1 + m2 + m3 + m4
przeciazenie =~ p1 + p2 + p3 + p4

wytrwalosc ~ samoregulacja + motywacja
prokrastynacja ~ samoregulacja + przeciazenie
wynik_nauki ~ samoregulacja + motywacja
"""

# semopy traktuje tu kategorie 1-5 numerycznie. To kontrola
# odtwarzalności, a nie odpowiednik progowego WLSMV z lavaan.
model = Model(model_opis)
rezultat = model.fit(dane)
if not rezultat.success:
    raise RuntimeError(rezultat.message)

parametry = model.inspect(std_est=True)
print(
    parametry.loc[
        parametry["op"].isin(["~", "=~"]),
        ["lval", "op", "rval", "Estimate", "Est. Std", "Std. Err", "p-value"],
    ]
)
print(calc_stats(model)[["chi2", "DoF", "CFI", "TLI", "RMSEA"]])

# Prosty I-CVI: odsetek ekspertów uznających pozycję za trafną.
# Oceny 3 i 4 na skali 1-4 liczymy jako zgodę.
oceny_ekspertow = pd.DataFrame(
    {
        "s1": [4, 4, 3, 4, 3, 4],
        "s2": [4, 3, 3, 4, 4, 4],
        "s3": [2, 3, 3, 4, 2, 4],
    }
)
i_cvi = oceny_ekspertow.ge(3).mean(axis=0)
s_cvi_ave = i_cvi.mean()
print("I-CVI:\n", i_cvi)
print("S-CVI/Ave:", s_cvi_ave)
