# -*- coding: utf-8 -*-
"""한국고용정보원 「기술혁신을 반영한 중장기 인력수요 전망 2016~2030」(2017)의 혁신 시나리오 — 산업별 부가가치 증가율 차이.

보고서는 두 경로를 제시한다. 기준전망(최근 추세 지속)과 혁신전망(4차 산업혁명 적극 대응: 총요소생산성·노동의 질 개선, 신성장산업 견인)이다.
  · 8장(산업연구원 KIET-DIMM 모형과 업종 전문가 조정): 세부 산업별 실질부가가치 연평균 증가율, 2017~21·2022~26·2027~30년
  · 11장(한국고용정보원 인력수요 모형): 인력수급 산업별 2016~2030년 실질부가가치 연평균 증가율
입력 파일(data/inputs/keis_r14_va_scenarios.csv)은 보고서에 인쇄된 값만 담는다. 차이·평균은 이 모듈이 계산한다.

설문 업종별 ΔVA(%p)
  KIET  : 세부 산업마다 (혁신 − 기준)을 세 구간 평균한 뒤, 같은 설문 업종에 대응하는 세부 산업을 단순평균한다.
  KEIS  : 11장 산업의 (혁신 − 기준)을 대응표(data/map_keis11_to_survey21.csv)로 설문 업종에 붙인다.
  평균  : 두 값의 평균(한쪽만 있으면 그 값).
"""
from __future__ import annotations

import numpy as np
import pandas as pd

PERIODS = ("2017~21", "2022~26", "2027~30")
VAL = "실질VA_연평균증가율_%"


def _diff(df: pd.DataFrame, keys: list[str]) -> pd.DataFrame:
    p = df.pivot_table(index=keys, columns="시나리오", values=VAL, aggfunc="first")
    return (p["혁신"] - p["기준"]).rename("차이").reset_index()


def r14_dva(scen_csv: str, map11_csv: str, short_names_csv: str) -> tuple[pd.DataFrame, dict]:
    """설문 21개 업종별 ΔVA(KIET·KEIS·평균, %p)와 전 산업 값(8장 표 8-6 세 구간 평균, 11장 전체)."""
    d = pd.read_csv(scen_csv)
    short = pd.read_csv(short_names_csv).set_index("설문업종_약칭")["설문업종"]
    # 8장 KIET 세부 산업
    k = d[d["표"].isin(["표 8-8", "표 8-9", "표 8-10", "표 8-12", "표 8-13", "표 8-14"])]
    kd = _diff(k, ["산업(원문)", "설문업종(KIET표 대응)", "기간"])
    kd = kd[kd["기간"].isin(PERIODS)].groupby(["산업(원문)", "설문업종(KIET표 대응)"])["차이"].mean().reset_index()
    kd["설문업종"] = kd["설문업종(KIET표 대응)"].str.split("|")
    kd = kd.explode("설문업종")
    kiet = kd.groupby("설문업종")["차이"].mean().rename(index=short).rename("ΔVA_KIET")
    tot_k = _diff(d[(d["표"] == "표 8-6") & (d["산업(원문)"] == "전 산업")], ["기간"])
    tot_kiet = float(tot_k[tot_k["기간"].isin(PERIODS)]["차이"].mean())
    # 11장 KEIS 인력수급 산업
    e = d[(d["기간"] == "2016~2030")]
    ed = _diff(e, ["산업(원문)"]).set_index("산업(원문)")["차이"]
    m = pd.read_csv(map11_csv)
    m["ΔVA_KEIS"] = m["KEIS11장_산업"].map(ed)
    keis = m.dropna(subset=["ΔVA_KEIS"]).groupby("설문업종")["ΔVA_KEIS"].mean()
    out = pd.concat([kiet, keis], axis=1).reindex(sorted(short.values))
    out["ΔVA_평균"] = out[["ΔVA_KIET", "ΔVA_KEIS"]].mean(axis=1, skipna=True)
    out.index.name = "설문업종"
    return out, {"전산업_KIET_3구간평균": tot_kiet, "전산업_KEIS_2016_2030": float(ed.get("전체", np.nan)),
                 "구간별_KIET": tot_k.set_index("기간")["차이"].reindex(PERIODS).round(3).to_dict()}
