import mysql.connector
from app.core import logger
from app.core.config import get_db_config
from app.schemas.today_goal_schema import CheckInRequest, MorningAssessmentRequest

B_DB_CONFIG = get_db_config("Sales_B_DB")

def get_db_connection():
    return mysql.connector.connect(**B_DB_CONFIG)

def process_30min_checkin(db_conn, checkin_data: CheckInRequest):
    cursor = db_conn.cursor(dictionary=True)
    try:
        cursor.execute("SELECT * FROM goals WHERE id = %s", (checkin_data.goal_id,))
        goal = cursor.fetchone()
        
        if not goal:
            raise ValueError("해당 목표를 찾을 수 없습니다.")

        is_success = checkin_data.increment_count > 0

        cursor.execute(
            """INSERT INTO check_in_logs (goal_id, increment_count, is_success, user_mood) 
               VALUES (%s, %s, %s, %s)""",
            (checkin_data.goal_id, checkin_data.increment_count, is_success, checkin_data.user_mood)
        )

        new_current_count = goal['current_count'] + checkin_data.increment_count
        cursor.execute(
            "UPDATE goals SET current_count = %s WHERE id = %s",
            (new_current_count, checkin_data.goal_id)
        )
        db_conn.commit()

        if is_success:
            ai_mode = "PRAISE"
            message = f"수고하셨습니다! 30분 동안 {checkin_data.increment_count}{goal['unit']}이나 해내셨네요. 이 기세로 계속 가볼까요?"
        else:
            ai_mode = "COUNSELING"
            message = f"실적이 없으셨군요. '{checkin_data.user_mood}' 때문이시군요. 괜찮습니다, 다음 30분은 어떻게 전략을 바꿔볼까요?"

        return {
            "status": "success",
            "is_success": is_success,
            "ai_mode": ai_mode,
            "message": message
        }
    except Exception as e:
        db_conn.rollback()
        raise e
    finally:
        cursor.close()
        
def evaluate_morning_motivation(db_conn, request_data: MorningAssessmentRequest): 
    cursor = db_conn.cursor(dictionary=True)
    try:
        log_query = """
            SELECT c.is_success, c.user_mood, c.check_time 
            FROM check_in_logs c
            JOIN goals g ON c.goal_id = g.id
            WHERE g.plan_id = %s
            ORDER BY c.check_time ASC
        """
        cursor.execute(log_query, (request_data.plan_id,))
        logs = cursor.fetchall()

        if not logs:
            raise ValueError("평가할 오전 체크인 기록이 없습니다.")

        total_checks = len(logs)
        success_checks = sum(1 for log in logs if log['is_success'])
        success_rate = success_checks / total_checks if total_checks > 0 else 0
        score = max(1, min(10, int(success_rate * 10)))

        moods = [log['user_mood'] for log in logs if log['user_mood']]
        
        cursor.execute("SELECT * FROM goals WHERE plan_id = %s", (request_data.plan_id,))
        goals = cursor.fetchall()
        adjusted_goals_list = []

        if score >= 6:
            motivation_level = "HIGH"
            ai_summary = f"오전 달성률 {int(success_rate*100)}%. 좋은 페이스를 유지하고 있습니다."
            afternoon_action = "오후にも 처음에 짠 '오늘의 목표' 대로 진행합니다. 파이팅!"
            
            for goal in goals:
                cursor.execute(
                    "UPDATE goals SET adjusted_target_count = %s WHERE id = %s",
                    (goal['original_target_count'], goal['id'])
                )
        else:
            motivation_level = "LOW"
            last_mood = moods[-1] if moods else "피로 누적"
            ai_summary = f"오전 달성률 {int(success_rate*100)}%. '{last_mood}' 등의 이유로 멘탈이 저하된 상태입니다."
            afternoon_action = "모티베이션이 낮아 남은 오후 목표를 20% 하향 조정했습니다. 부담을 덜고 시작해봅시다."

            for goal in goals:
                original = goal['original_target_count']
                current = goal['current_count']
                
                if current >= original:
                    new_target = original
                else:
                    remaining = original - current
                    new_target = current + int(remaining * 0.8) 
                
                cursor.execute(
                    "UPDATE goals SET adjusted_target_count = %s WHERE id = %s",
                    (new_target, goal['id'])
                )
                
                if new_target != original:
                    adjusted_goals_list.append({
                        "goal_id": goal['id'],
                        "category": goal['category'],
                        "original_target": original,
                        "adjusted_target": new_target
                    })

        update_query = """
            UPDATE daily_plans 
            SET morning_motivation_score = %s, ai_feedback_summary = %s 
            WHERE id = %s
        """
        cursor.execute(update_query, (score, ai_summary, request_data.plan_id))
        db_conn.commit()

        return {
            "motivation_level": motivation_level,
            "score": score,
            "ai_summary": ai_summary,
            "afternoon_action": afternoon_action,
            "adjusted_goals": adjusted_goals_list
        }
    except Exception as e:
        db_conn.rollback()
        raise e
    finally:
        cursor.close()