QUESTION_AXIS_MAP = {
    1: "visual_imagery",
    2: "visual_imagery",
    3: "visual_imagery",
    4: "context_sensitivity",
    5: "context_sensitivity",
    6: "context_sensitivity",
    7: "externalization",
    8: "externalization",
    9: "externalization",
    10: "internal_monologue",
    11: "internal_monologue",
    12: "internal_monologue",
    13: "internal_monologue",
    14: "Abstraction",
    15: "Abstraction",
    16: "Abstraction",
    17: "Temporal_Integration",
    18: "Temporal_Integration",
    19: "Temporal_Integration",
    20: "Temporal_Integration",
}

REVERSE_QUESTIONS = {1,3,4,6,7,10,12,16,17,18}

# 역채점용 value 매핑 (1.2↔5, 1.9↔4.3, 3↔3)
REVERSE_VALUE_MAP = {
    1.2: 5,
    1.9: 4.3,
    3: 3,
    4.3: 1.9,
    5: 1.2,
}


def calculate_human_os(answers: list) -> tuple:
    """축별 평균과 총합 스코어를 분리해서 반환"""
    axis_scores = {}
    all_scores = []  # 전체 문항 점수 (総合スコア용)

    for ans in answers:
        q_id = ans["question_id"]
        score = float(ans["value"])

        if q_id in REVERSE_QUESTIONS:
            score = REVERSE_VALUE_MAP.get(score, score)

        axis = QUESTION_AXIS_MAP.get(q_id)
        if axis:
            if axis not in axis_scores:
                axis_scores[axis] = []
            axis_scores[axis].append(score)
            all_scores.append(score)

    # 축별 평균 계산
    axis_averages = {}
    for axis, scores in axis_scores.items():
        axis_averages[axis] = round(sum(scores) / len(scores), 1)

    # 전체 평균 (総合スコア) → output_value 컬럼용
    overall_score = round(sum(all_scores) / len(all_scores), 1) if all_scores else 0.0

    return axis_averages, overall_score


def format_for_db(axis_averages: dict) -> dict:
    name_map = {
        "visual_imagery": "感覚イメージ",
        "context_sensitivity": "文脈依存",
        "externalization": "外部化依存",
        "internal_monologue": "内言語機能",
        "Abstraction": "抽象化",
        "Temporal_Integration": "時間統合",
    }
    return {name_map[k]: v for k, v in axis_averages.items()}

