from typing import List, Dict
import mysql.connector
from app.core import get_db_connection, logger
from app.core.config import get_db_config

A_DB_CONFIG = get_db_config("Sales_A_DB")
B_DB_CONFIG = get_db_config("Sales_B_DB")

# ==========================================
# 🟢 A 파트 전용 함수 (chat_history 테이블)
# ==========================================
# 첫 대화 A/B PART 구분 
# 1. 로그 저장 함수
def save_chat_log(session_id, sender, message):
    try:
        conn = mysql.connector.connect(**A_DB_CONFIG)
        cursor = conn.cursor()
        sql = "INSERT INTO chat_history (session_id, sender, message) VALUES (%s, %s, %s)"
        cursor.execute(sql, (session_id, sender, message))
        conn.commit()
        cursor.close()
        conn.close()
    except Exception as e:
        logger.error(f"Chat DB Save Error: {e}")

# 2. 히스토리 조회 함수
def get_history_from_db(session_id):
    try:
        conn = mysql.connector.connect(**A_DB_CONFIG)
        cursor = conn.cursor(dictionary=True)
        sql = "SELECT sender, message FROM chat_history WHERE session_id = %s ORDER BY id ASC"
        cursor.execute(sql, (session_id,))
        rows = cursor.fetchall()
        cursor.close()
        conn.close()
        return rows
    except Exception as e:
        logger.error(f"Chat DB Load Error: {e}")
        return []
    
    
# ==========================================
# 🔵 B 파트 전용 함수 (daily_logs 테이블)
# ==========================================
def save_daily_log(session_id, sender, message):
    try:
        conn = mysql.connector.connect(**B_DB_CONFIG)
        cursor = conn.cursor()
        sql = "INSERT INTO daily_logs (session_id, sender, message) VALUES (%s, %s, %s)"
        cursor.execute(sql, (session_id, sender, message))
        conn.commit()
    except Exception as e:
        logger.error(f"Daily Log Save Error: {e}")
    finally:
        if 'conn' in locals() and conn.is_connected():
            cursor.close()
            conn.close()

def get_daily_log_from_db(session_id):
    try:
        conn = mysql.connector.connect(**B_DB_CONFIG)
        cursor = conn.cursor(dictionary=True)
        sql = "SELECT sender, message, created_at FROM daily_logs WHERE session_id = %s ORDER BY id ASC"
        cursor.execute(sql, (session_id,))
        rows = cursor.fetchall()
        return rows
    except Exception as e:
        logger.error(f"Daily Log Load Error: {e}")
        return []
    finally:
        if 'conn' in locals() and conn.is_connected():
            cursor.close()
            conn.close()

def check_today_daily_log_exists(session_id: str) -> bool:
    try:
        conn = mysql.connector.connect(**B_DB_CONFIG)
        cursor = conn.cursor(dictionary=True)
        sql = """
            SELECT id FROM daily_logs 
            WHERE session_id = %s AND DATE(created_at) = CURDATE()
            LIMIT 1
        """
        cursor.execute(sql, (session_id,))
        row = cursor.fetchone()
        return row is not None
    except Exception as e:
        logger.error(f"Check Today Daily Log Error: {e}")
        return False
    finally:
        if 'conn' in locals() and conn.is_connected():
            cursor.close()
            conn.close()


# ==========================================
# ⚙️ 공통 유저 상태 관리 함수
# ==========================================
def get_a_part_status(session_id: str) -> int:
    conn = None
    try:
        conn = mysql.connector.connect(**A_DB_CONFIG)
        cursor = conn.cursor(dictionary=True)
        sql = """
            SELECT a_part_status
            FROM user_profile_summary
            WHERE session_id = %s
        """
        cursor.execute(sql, (session_id,))
        row = cursor.fetchone()
        if row is None:
            # 아직 summary 테이블에 레코드가 없다면 기본값 0 (미완료)
            return 0
        return row.get("a_part_status", 0) or 0
    except Exception as e:
        print(f"Get A Part Status Error: {e}")
        return 0
    finally:
        if conn:
            cursor.close()
            conn.close()

def update_a_part_status(session_id: str, status: int):
    conn = None
    try:
        conn = mysql.connector.connect(**A_DB_CONFIG)
        cursor = conn.cursor()
        sql = """
            INSERT INTO user_profile_summary (session_id, a_part_status)
            VALUES (%s, %s)
            ON DUPLICATE KEY UPDATE
                a_part_status = VALUES(a_part_status),
                updated_at = NOW()
        """
        cursor.execute(sql, (session_id, status))
        conn.commit()
    except Exception as e:
        print(f"Update A Part Status Error: {e}")
    finally:
        if conn:
            cursor.close()
            conn.close()

def get_username(session_id: str) -> str:
    """유저 이름 조회"""
    conn = None
    try:
        conn = mysql.connector.connect(**A_DB_CONFIG)
        cursor = conn.cursor(dictionary=True)
        sql = """
            SELECT username
            FROM user_profile_summary
            WHERE session_id = %s
        """
        cursor.execute(sql, (session_id,))
        row = cursor.fetchone()
        if row and row.get("username"):
            return row["username"]
        return None
    except Exception as e:
        logger.error(f"Get Username Error: {e}")
        return None
    finally:
        if conn:
            cursor.close()
            conn.close()

def save_username(session_id: str, username: str):
    """유저 이름 저장"""
    conn = None
    try:
        conn = mysql.connector.connect(**A_DB_CONFIG)
        cursor = conn.cursor()
        sql = """
            INSERT INTO user_profile_summary (session_id, username)
            VALUES (%s, %s)
            ON DUPLICATE KEY UPDATE
                username = VALUES(username),
                updated_at = NOW()
        """
        cursor.execute(sql, (session_id, username))
        conn.commit()
    except Exception as e:
        logger.error(f"Save Username Error: {e}")
    finally:
        if conn:
            cursor.close()
            conn.close()