import mysql.connector
from app.core.config import get_db_config, logger
from datetime import timedelta
from datetime import datetime, timedelta
import openpyxl 
import subprocess
import os
from openpyxl.formatting.rule import DataBarRule

# C_DB 설정 가져오기
C_DB_CONFIG = get_db_config("Sales_C_DB")
Goalskill_login_DB_CONFIG = get_db_config("Sales_Goalskill_login")

def get_real_chart_data(session_id: str):
    """
    P_(개인) 와 T_(팀) 테이블에서 
    category 2, 3, 4, 5, 6, 8 인 데이터만 가져와서
    기간별(일/주/월/분기) 성과율(achievement_rate)을 병합하여 반환.
    """
    config = get_db_config("Sales_C_DB")
    
    # 1. 기간별 테이블 접미사 매핑
    periods = {
        "日次": "daily", 
        "週次": "weekly", 
        "月次": "monthly", 
        "1/4期次": "quarterly"
    }
    
    # 2. ★ 요청하신 카테고리 ID -> 타이틀 매핑 (수정됨)
    category_map = {
        2: "架電数",
        3: "繋がるための行動",
        4: "アポ",
        5: "訪問",
        6: "見積",
        8: "受注"
    }
    
    # 순서 보장을 위해 리스트로 키 관리 (선택 사항이지만 차트 순서 고정에 도움됨)
    target_categories = [2, 3, 4, 5, 6, 8]

    response_data = {}

    conn = None
    cursor = None

    try:
        conn = mysql.connector.connect(**config)
        cursor = conn.cursor(dictionary=True)

        for label, suffix in periods.items():
            p_table = f"P_{suffix}" # 예: P_daily
            t_table = f"T_{suffix}" # 예: T_daily
            
            period_list = []
            
            # 3. SQL 쿼리: 해당 카테고리들만 조회 (IN 절 사용)
            # (최신 날짜 기준: record_date 내림차순, id 내림차순으로 정렬하여 상위 데이터 사용)
            format_strings = ','.join(['%s'] * len(target_categories)) # "%s,%s,%s,%s,%s,%s"
            
            # P_ 테이블 (다나카)
            sql_p = f"""
                SELECT category, achievement_rate 
                FROM {p_table} 
                WHERE session_id = %s 
                  AND category IN ({format_strings})
                ORDER BY record_date DESC, id DESC
            """
            # 파라미터: session_id + 카테고리 리스트
            params = [session_id] + target_categories
            cursor.execute(sql_p, params)
            p_rows = cursor.fetchall()
            
            # T_ 테이블 (팀)
            # (팀 데이터도 session_id로 구분한다고 가정. 만약 팀 전체 공통 데이터라면 WHERE 절 수정 필요)
            sql_t = f"""
                SELECT category, achievement_rate 
                FROM {t_table} 
                WHERE session_id = %s 
                  AND category IN ({format_strings})
                ORDER BY record_date DESC, id DESC
            """
            cursor.execute(sql_t, params)
            t_rows = cursor.fetchall()

            # 4. 데이터 매핑 (중복 제거: 가장 최신 데이터 1개씩만 남김)
            # 딕셔너리 컴프리헨션 이용: 나중 데이터가 덮어씌워지므로, 쿼리에서 DESC 정렬했으면 
            # 먼저 나온게 최신. 따라서 루프 돌면서 이미 있으면 건너뛰는 방식이 안전함.
            
            p_dict = {}
            for row in p_rows:
                if row['category'] not in p_dict:
                    p_dict[row['category']] = row['achievement_rate']
            
            t_dict = {}
            for row in t_rows:
                if row['category'] not in t_dict:
                    t_dict[row['category']] = row['achievement_rate']

            # 5. 최종 데이터 구조 생성 (지정한 순서 2,3,4,5,6,8 대로)
            for cat_id in target_categories:
                cat_name = category_map[cat_id]
                
                tanaka_rate = p_dict.get(cat_id, 0) # 데이터 없으면 0
                team_rate = t_dict.get(cat_id, 0)   # 데이터 없으면 0
                
                if tanaka_rate is None: tanaka_rate = 0
                if team_rate is None: team_rate = 0
                
                diff = tanaka_rate - team_rate

                period_list.append({
                    "title": cat_name,       # 화면에 표시될 이름 (예: 架電数)
                    "tanaka": tanaka_rate,
                    "team": team_rate,
                    "diff": diff
                })
            
            response_data[label] = period_list

        return response_data

    except Exception as e:
        logger.error(f"Chart Data Error: {e}")
        return {}
    finally:
        if cursor: cursor.close()
        if conn: conn.close()