# -*- coding: utf-8 -*-
"""AI 수용도조사 원자료(n=2,297) — 필요한 열만 읽어 업종·도입 여부·AI 중요도·영향 정도를 집계한다.

원자료에는 사업체명·법인등록번호 등 식별 정보가 있으므로 아래 COLS의 열만 읽고 다른 열은 메모리에도 올리지 않는다.
결과는 모두 집계값이며, 집계 결과도 비공개 자료로 다룬다(공개 화면에서는 출력을 숨긴다).
"""
from __future__ import annotations

import numpy as np
import pandas as pd

# 원자료 열 번호(1부터) → 이름. 1–3행은 문항 머리, 4행은 변수 코드 행(예: a1a)이며 그 아래가 응답이다.
COLS = {10: "KSIC", 67: "자동화", 138: "예측형", 210: "생성형", 341: "D2_AI",
        360: "E41_2025", 361: "E41_2029", 362: "E41_2034", 363: "E41_2040",
        367: "E51_2025", 368: "E51_2029", 369: "E51_2034", 370: "E51_2040"}
HEADER_ROWS = 3


def read_raw(xlsx_path: str) -> pd.DataFrame:
    """식별 정보를 제외한 13개 열만 읽는다(pandas는 usecols를 파일 순서대로 돌려준다)."""
    idx = sorted(COLS)
    df = pd.read_excel(xlsx_path, header=None, usecols=[i - 1 for i in idx], skiprows=HEADER_ROWS)
    df.columns = [COLS[i] for i in idx]
    df = df[df["KSIC"].astype(str).str.match(r"^[A-Z]\d")].copy()      # 변수 코드 행 등 응답이 아닌 행 제외
    for c in df.columns[1:]:
        df[c] = pd.to_numeric(df[c], errors="coerce")
    df["섹션"] = df["KSIC"].astype(str).str[0]
    df["도입"] = df[["자동화", "예측형", "생성형"]].notna().any(axis=1)
    return df


SECTION_NAME = {"A": "농림어업", "B": "광업", "C": "제조", "D": "전기가스", "E": "수도·환경", "F": "건설", "G": "도소매",
                "H": "운수", "I": "숙박음식", "J": "정보통신", "K": "금융", "L": "부동산", "M": "전문과학", "N": "사업지원",
                "P": "교육", "Q": "보건", "R": "예술"}


def summary(df: pd.DataFrame) -> dict:
    return {"응답수": len(df), "D2_평균": df["D2_AI"].mean(), "D2_중위": df["D2_AI"].median(),
            "E41_2025": df["E41_2025"].mean(), "E41_2040": df["E41_2040"].mean(),
            "도입_수": int(df["도입"].sum()), "미도입_수": int((~df["도입"]).sum())}


def by_adoption(df: pd.DataFrame) -> pd.DataFrame:
    g = df.groupby(df["도입"].map({True: "도입", False: "미도입"}))
    return pd.DataFrame({"사업체수": g.size(), "E4-1_2040": g["E41_2040"].mean(), "E5-1_2040": g["E51_2040"].mean(), "D2_AI(%)": g["D2_AI"].mean()})


def by_section(df: pd.DataFrame, min_n: int = 20) -> pd.DataFrame:
    g = df.groupby("섹션")
    t = pd.DataFrame({"사업체수": g.size(), "E4-1_2040": g["E41_2040"].mean(), "D2_AI(%)": g["D2_AI"].mean()})
    t = t[t["사업체수"] >= min_n].sort_values("E4-1_2040", ascending=False)
    t.insert(0, "섹션명", [SECTION_NAME.get(k, k) for k in t.index])
    return t
