#!/usr/bin/env python3
"""
Zarobki absolwentów kierunków AI wobec klasycznej informatyki — analiza ELA.

Źródło: Ekonomiczne Losy Absolwentów (ELA), Strefa Eksperta, 11. edycja (2026).
Dane rejestrowe ZUS + POL-on, prowadzone przez OPI PIB dla MNiSW.
Plik: https://ela.nauka.gov.pl/sla-server/v6.0/dataExperts/graduates/graduates-major-data.csv

Uruchomienie:  python3 analiza.py graduates-major-data.csv > wyniki.json
"""
import csv, json, re, sys

# Kierunek liczy się jako „AI”, gdy ma w nazwie sztuczną inteligencję, uczenie
# maszynowe, systemy inteligentne albo data science. Specjalności wewnątrz
# zwykłej informatyki nie są w ELA wyodrębniane, więc ich tu nie widać.
AI = re.compile(r'sztuczn\w+ inteligencj|artificial intelligence|machine learning'
                r'|uczeni\w+ maszynow|systemy inteligentne|data science', re.I)
INF = re.compile(r'informat', re.I)

def liczba(v):
    v = (v or '').strip().replace(',', '.')
    try:
        return float(v)
    except ValueError:
        return None

def main(sciezka):
    czytnik = csv.reader(open(sciezka, encoding='utf-8'), delimiter=';')
    naglowek = next(czytnik)
    ix = {c: i for i, c in enumerate(naglowek)}

    trendy, ai_trendy, pary, dosw = {}, {}, [], {}

    for w in czytnik:
        try:
            rok, poziom = w[ix['P_ROKDYP']], w[ix['P_POZIOM']]
            if poziom not in ('2', 'II'):          # tylko studia II stopnia
                continue
            nazwa = w[ix['P_NAZWA_KIERUNKU_PELNA']]
            uczelnia = w[ix['P_UCZELNIA_SKROT']] or w[ix['P_NAZWA_UCZELNI']]
            n = liczba(w[ix['P_N']])
            if not n:
                continue

            zar = liczba(w[ix['P_ME_ZAR_P1']])     # mediana zarobków, 1. rok po dyplomie
            wwz = liczba(w[ix['P_WWZ_P1']])        # zarobki / średnia w powiecie
            bez = liczba(w[ix['P_CZY_BEZR_P1']])   # % z epizodem bezrobocia
            zd  = liczba(w[ix['P_ME_ZAR_DOSW_P1']])
            zn  = liczba(w[ix['P_ME_ZAR_NDOSW_P1']])

            czy_ai = bool(AI.search(nazwa))
            czy_inf = bool(INF.search(nazwa)) and not czy_ai
            if not (czy_ai or czy_inf):
                continue

            cel = ai_trendy if czy_ai else trendy
            d = cel.setdefault(rok, {'n': 0, 'wwz': 0, 'wwz_n': 0, 'bez': 0, 'bez_n': 0, 'programow': 0})
            d['n'] += n
            d['programow'] += 1
            if wwz is not None:
                d['wwz'] += wwz * n; d['wwz_n'] += n
            if bez is not None:
                d['bez'] += bez * n; d['bez_n'] += n

            if rok == '2024' and zar:
                pary.append({'uczelnia': uczelnia, 'kierunek': nazwa, 'typ': 'AI' if czy_ai else 'INF',
                             'zarobki': zar, 'n': int(n)})
            if rok == '2024' and zd and zn:
                k = 'ai' if czy_ai else 'inf'
                e = dosw.setdefault(k, {'zd': 0, 'zn': 0, 'n': 0})
                e['zd'] += zd * n; e['zn'] += zn * n; e['n'] += n
        except (IndexError, KeyError):
            continue

    def serie(d):
        return {r: {'absolwentow': int(v['n']), 'programow': v['programow'],
                    'wwz': round(v['wwz'] / v['wwz_n'], 3) if v['wwz_n'] else None,
                    'bezrobocie_proc': round(v['bez'] / v['bez_n'], 2) if v['bez_n'] else None}
                for r, v in sorted(d.items())}

    # Porównania w obrębie jednej uczelni: każdy kierunek AI wobec największego
    # kierunku informatycznego na tej samej uczelni, ten sam rocznik i poziom.
    porownania = []
    wg_uczelni = {}
    for p in pary:
        wg_uczelni.setdefault(p['uczelnia'], {'AI': [], 'INF': []})[p['typ']].append(p)
    for u, v in sorted(wg_uczelni.items()):
        if not (v['AI'] and v['INF']):
            continue
        baza = max(v['INF'], key=lambda t: t['n'])
        for a in v['AI']:
            porownania.append({
                'uczelnia': u,
                'kierunek_ai': a['kierunek'], 'zarobki_ai': a['zarobki'], 'n_ai': a['n'],
                'kierunek_inf': baza['kierunek'], 'zarobki_inf': baza['zarobki'], 'n_inf': baza['n'],
                'przewaga_informatyki_proc': round((baza['zarobki'] - a['zarobki']) / a['zarobki'] * 100, 1),
            })

    premia = {}
    for k, v in dosw.items():
        zd, zn = v['zd'] / v['n'], v['zn'] / v['n']
        premia[k] = {'z_doswiadczeniem': round(zd), 'bez_doswiadczenia': round(zn),
                     'premia_proc': round((zd - zn) / zn * 100, 1)}

    return {
        'zrodlo': 'ELA, Strefa Eksperta, 11. edycja (2026); dane rejestrowe ZUS i POL-on',
        'poziom': 'studia II stopnia',
        'wskaznik_zarobkow': 'mediana zarobków w pierwszym roku po dyplomie (P_ME_ZAR_P1)',
        'informatyka_bez_ai_w_nazwie': serie(trendy),
        'kierunki_z_ai_w_nazwie': serie(ai_trendy),
        'porownania_w_obrebie_uczelni_rocznik_2024': porownania,
        'premia_za_doswiadczenie_rocznik_2024': premia,
    }

if __name__ == '__main__':
    print(json.dumps(main(sys.argv[1]), ensure_ascii=False, indent=2))
