"""
現在地とチーム基準: 버튼 클릭 시 진입. 개인 실적 → 분기 계획 → 팀 시트.
今の達成状況 進入時に user_profile_summary.a_part_status を 1 に更新。
"""
from fastapi import APIRouter, HTTPException, Body, Query
from typing import Dict, Any

from app.models.sales_sheet_module import insert_sales_sheet_records
from app.models import current_position_module as cp_module
from app.models.general_module import update_a_part_status

router = APIRouter(
    prefix="/goalskill-sales/api/current-position",
    tags=["CurrentPosition"],
)


@router.post("/achievement")
async def save_achievement(
    payload: Dict[str, Any] = Body(...),
):
    """
    session_id, period_type(例: quarter), achievements: { "1": 100, "2": 50, ... }
    → sales_sheet_data に sheet_type=1s, record_type=result で保存。
    """
    session_id = payload.get("session_id")
    period_type = payload.get("period_type") or "quarter"
    achievements = payload.get("achievements") or {}
    if not session_id:
        raise HTTPException(status_code=400, detail="session_id required")
    records = []
    for cat_str, val in achievements.items():
        try:
            cat = int(cat_str)
        except (TypeError, ValueError):
            continue
        if cat < 1 or cat > 9:
            continue
        try:
            v = float(val) if val is not None else None
        except (TypeError, ValueError):
            v = None
        if v is None:
            continue
        records.append({
            "session_id": session_id,
            "sheet_type": "1s",
            "period_type": period_type,
            "record_type": "result",
            "category": cat,
            "value": v,
        })
    if not records:
        return {"ok": False, "message": "有効な達成数がありません。", "count": 0}
    try:
        count = insert_sales_sheet_records(records)
        return {"ok": True, "message": "保存しました。", "count": count}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.post("/set-a-part-complete")
async def set_a_part_complete(payload: Dict[str, Any] = Body(...)):
    """
    今の達成状況 ボタン押下時に A-part 完了扱い: user_profile_summary.a_part_status を 1 に更新。
    """
    session_id = payload.get("session_id")
    if not session_id:
        raise HTTPException(status_code=400, detail="session_id required")
    try:
        update_a_part_status(session_id, 1)
        return {"ok": True, "message": "a_part_status updated to 1"}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/targets")
async def get_targets(session_id: str = Query(..., description="session_id")):
    """
    1s, quarter の 카테고리별 목표치 조회 (2,3,4,5,6,8).
    """
    try:
        return cp_module.get_quarter_targets(session_id)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/targets-and-results")
async def get_targets_and_results(session_id: str = Query(..., description="session_id")):
    """
    1s, quarter の target + result を取得（02/19データ・フォーム事前表示用）.
    """
    try:
        return cp_module.get_quarter_targets_and_results(session_id)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/user-achievement-summary")
async def get_user_achievement_summary(session_id: str = Query(..., description="session_id")):
    """
    個人のみ 達成率 요약（팀 없이）.
    """
    try:
        return cp_module.get_user_achievement_summary(session_id)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.post("/quarter-plan")
async def save_quarter_plan(
    payload: Dict[str, Any] = Body(...),
):
    """
    session_id, period_type, plans: { "2": 400, "3": 70, ... } → sales_quarter_plan 저장.
    """
    session_id = payload.get("session_id")
    period_type = payload.get("period_type") or "quarter"
    plans = payload.get("plans") or {}
    if not session_id:
        raise HTTPException(status_code=400, detail="session_id required")
    try:
        count = cp_module.save_quarter_plan(session_id, period_type, plans)
        if count == 0:
            return {"ok": False, "message": "有効な計画がありません。", "count": 0}
        return {"ok": True, "message": "保存しました。", "count": count}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/quarter-plan-summary")
async def get_quarter_plan_summary(
    session_id: str = Query(...),
    period_type: str = Query("quarter"),
):
    """계획 달성률 요약 (target + planned → rate)."""
    try:
        return cp_module.get_quarter_plan_summary(session_id, period_type)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/comparison")
async def get_comparison(
    session_id: str = Query(...),
    period_type: str = Query("quarter"),
):
    """유저 계획 달성율 vs 팀 달성율 비교 (그래프용)."""
    try:
        return cp_module.get_comparison_data(session_id, period_type)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
