from fastapi import APIRouter, HTTPException, Depends
from pydantic import BaseModel
from datetime import datetime
from app.schemas.today_goal_schema import StartDayRequest, CheckInRequest, CheckInResponse, MorningAssessmentRequest, MorningAssessmentResponse, MorningReflectionResponse, MorningReflectionRequest, EndDayRequest, EndDayResponse, SubmitSalesReportRequest, BossCommentRequest, CounselingRequest, FinalReviewAnalysisRequest, SubmitFinalReviewRequest, FinishCounselingRequest
from app.models import today_goal_module

# 💡 목표 관리용 독립된 주소 적용
router = APIRouter(
    prefix="/goalskill-sales/api",
    tags=["Today Goal"]
)

def get_db():
    conn = today_goal_module.get_db_connection()
    try:
        yield conn
    finally:
        conn.close()
        
@router.get("/goal-templates")
def get_goal_templates(session_id: str, db_conn = Depends(get_db)):
    cursor = db_conn.cursor(dictionary=True)
    try:
        # session_id가 일치하는 템플릿만 가져옴
        sql = """
            SELECT * FROM goal_templates 
            WHERE is_active = 1 AND session_id = %s 
            ORDER BY display_order ASC
        """
        cursor.execute(sql, (session_id,))
        templates = cursor.fetchall()
        return {"templates": templates}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.post("/start-day")
def start_day(request: StartDayRequest, db_conn = Depends(get_db)):
    try:
        cursor = db_conn.cursor(dictionary=True)
        today_date = datetime.now().strftime("%Y-%m-%d")
        
        # 1. 계획(daily_plans) 조회 또는 생성
        check_sql = """
            SELECT id, total_status, is_report_submitted 
            FROM daily_plans 
            WHERE session_id = %s AND date = %s
        """
        cursor.execute(check_sql, (request.session_id, today_date))
        plan = cursor.fetchone()
        
        plan_id = None
        current_status = "進行中"
        is_report_submitted = 0
        
        if plan:
            plan_id = plan['id']
            current_status = plan['total_status']
            is_report_submitted = plan['is_report_submitted']
        else:
            insert_plan_sql = "INSERT INTO daily_plans (session_id, date, total_status) VALUES (%s, %s, '進行中')"
            cursor.execute(insert_plan_sql, (request.session_id, today_date))
            plan_id = cursor.lastrowid
            
        # get recent boss comment
        comment_sql = """
            SELECT boss_comment 
            FROM daily_plans 
            WHERE session_id = %s 
              AND boss_comment IS NOT NULL 
              AND boss_comment != ''
            ORDER BY date DESC 
            LIMIT 1
        """
        cursor.execute(comment_sql, (request.session_id,))
        recent_comment_row = cursor.fetchone()
        
        # 최근 코멘트가 있으면 그것을 사용, 없으면 None
        boss_comment = recent_comment_row['boss_comment'] if recent_comment_row else None
            
        # 2. [신규 로직] 목표(goals)가 실제로 존재하는지 확인 (유령 계획 방지)
        cursor.execute("SELECT COUNT(*) as cnt FROM goals WHERE plan_id = %s", (plan_id,))
        goal_count = cursor.fetchone()['cnt']
        
        # 3. 목표가 하나도 없으면 템플릿에서 복사 (계획 생성 여부와 상관없이 실행)
        if goal_count == 0:
            template_sql = """
                SELECT * FROM goal_templates 
                WHERE is_active = 1 AND session_id = %s 
                ORDER BY display_order ASC
            """
            cursor.execute(template_sql, (request.session_id,))
            templates = cursor.fetchall()
            
            insert_goal_sql = """
                INSERT INTO goals (plan_id, category, title, original_target_count, adjusted_target_count, current_count, unit)
                VALUES (%s, %s, %s, %s, %s, 0, %s)
            """
            for t in templates:
                cursor.execute(insert_goal_sql, (
                    plan_id, 
                    t['category'], 
                    t['title'], 
                    t['default_target_count'], 
                    t['default_target_count'], 
                    t['unit']
                ))
            
            db_conn.commit()
            print(f"DEBUG: Goals created for plan {plan_id}")

        # 4. 메인 목표 ID 조회
        get_main_goal_sql = "SELECT id FROM goals WHERE plan_id = %s AND title = '架電数' LIMIT 1"
        cursor.execute(get_main_goal_sql, (plan_id,))
        main_goal = cursor.fetchone()
        
        # 5. 전체 목표 리스트 반환
        cursor.execute("""
            SELECT id, title, original_target_count, adjusted_target_count, current_count, unit 
            FROM goals 
            WHERE plan_id = %s
        """, (plan_id,))
        current_goals = cursor.fetchall()
        
        return {
            "message": "Start successful", 
            "plan_id": plan_id, 
            "total_status": current_status,
            "boss_comment": boss_comment,
            "is_report_submitted": is_report_submitted,
            "main_goal_id": main_goal['id'] if main_goal else None,
            "goals": current_goals
        }

    except Exception as e:
        db_conn.rollback()
        raise HTTPException(status_code=500, detail=str(e))

@router.post("/check-in", response_model=CheckInResponse)
def submit_checkin(request_data: CheckInRequest, db_conn = Depends(get_db)):
    try:
        result = today_goal_module.process_30min_checkin(db_conn, request_data)
        return result
    except ValueError as ve:
        raise HTTPException(status_code=404, detail=str(ve))
    except Exception as e:
        raise HTTPException(status_code=500, detail="サーバー内部でエラーが発生しました。")
    
@router.post("/morning-assessment", response_model=MorningAssessmentResponse)
def assess_morning(request_data: MorningAssessmentRequest, db_conn = Depends(get_db)):
    try:
        result = today_goal_module.evaluate_morning_motivation(db_conn, request_data)
        return result
    except ValueError as ve:
        raise HTTPException(status_code=400, detail=str(ve))
    except Exception as e:
        raise HTTPException(status_code=500, detail="サーバー内部でエラーが発生しました。")
    
@router.post("/morning-reflection", response_model=MorningReflectionResponse)
def submit_morning_reflection(request_data: MorningReflectionRequest, db_conn = Depends(get_db)):
    try:
        result = today_goal_module.save_morning_reflection(db_conn, request_data)
        return result
    except Exception as e:
        raise HTTPException(status_code=500, detail="サーバー内部でエラーが発生しました。")
    
    
@router.post("/end-day", response_model=EndDayResponse)
def finish_day(request_data: EndDayRequest, db_conn = Depends(get_db)):
    try:
        result = today_goal_module.finish_day_and_get_report(db_conn, request_data)
        return result
    except Exception as e:
        raise HTTPException(status_code=500, detail="Server Error")
 
    
@router.post("/sales-report")
def submit_sales_report(request_data: SubmitSalesReportRequest, db_conn = Depends(get_db)):
    try:
        return today_goal_module.save_sales_report(db_conn, request_data)
    except Exception as e:
        raise HTTPException(status_code=500, detail="Server Error")

@router.get("/boss/reports/{session_id}")
def get_boss_reports(session_id: str, db_conn = Depends(get_db)):
    try:
        return today_goal_module.get_boss_daily_reports(db_conn, session_id)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
    
@router.post("/Report/boss-comment")
def submit_boss_comment(request_data: BossCommentRequest, db_conn = Depends(get_db)):
    try:
        return today_goal_module.save_boss_comment(db_conn, request_data)
    except Exception as e:
        raise HTTPException(status_code=500, detail="Server Error")

# check boss comment
@router.get("/status")
def get_today_status(session_id: str, db_conn = Depends(get_db)):
    try:
        cursor = db_conn.cursor(dictionary=True)
        today_date = datetime.now().strftime("%Y-%m-%d")
        
        sql = "SELECT total_status, boss_comment FROM daily_plans WHERE session_id = %s AND date = %s"
        cursor.execute(sql, (session_id, today_date))
        result = cursor.fetchone()
        
        if result:
            return {
                "total_status": result['total_status'],
                "boss_comment": result['boss_comment']
            }
        else:
            return {"total_status": "Not Started", "boss_comment": None}
            
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
    
    
@router.post("/counseling/chat")
def counseling_chat(request_data: CounselingRequest, db_conn = Depends(get_db)):
    try:
        return today_goal_module.process_counseling_message(db_conn, request_data)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
    
@router.post("/final-review/analyze")
def analyze_daily_report(request_data: FinalReviewAnalysisRequest, db_conn = Depends(get_db)):
    """
    제출된 영업일지(항목별 회고)와 성과를 바탕으로 AI 분석 코멘트 생성
    """
    try:
        return today_goal_module.generate_final_ai_review(db_conn, request_data)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.post("/final-review/submit")
def submit_final_review(request_data: SubmitFinalReviewRequest, db_conn = Depends(get_db)):
    """
    유저의 최종 총평과 AI 코멘트를 DB에 저장
    """
    try:
        return today_goal_module.save_final_review(db_conn, request_data)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
    
    
@router.post("/counseling/finish")
def finish_counseling(request_data: FinishCounselingRequest, db_conn = Depends(get_db)):
    """
    오전 상담 종료 시, 대화 내용을 요약하여 DB에 저장
    """
    try:
        return today_goal_module.summarize_morning_counseling(db_conn, request_data)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
    
    
@router.get("/history/{session_id}")
def get_user_history(session_id: str, db_conn = Depends(get_db)):
    """
    유저가 자신의 과거 일지 기록을 조회하는 API
    """
    try:
        # 기존 상사 리포트 조회 로직을 재사용하여 데이터를 반환
        return today_goal_module.get_boss_daily_reports(db_conn, session_id)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
    
    
@router.get("/progress/goal-rates/{session_id}")
def get_goal_rates(session_id: str):
    """
    프론트엔드에서 엑셀 다운로드 후 '아니오' 클릭 시,
    Sales_C_DB의 T_daily 테이블에서 팀의 항목별 달성률을 조회하는 API
    """
    try:
        # Sales_C_DB를 조회하는 함수 호출
        return today_goal_module.get_team_goal_rates(session_id)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))