"""
Code API Routes - endpoints для работы с кодом
"""

from fastapi import APIRouter, HTTPException
from typing import Dict, Any
from .models import CodeErrorRequest
from .utils import generate_success_response, generate_error_response

router = APIRouter(prefix="/api/code", tags=["code"])

@router.post("/error/save")
async def code_error_save(data: CodeErrorRequest):
    """Сохранить ошибку кода + решение"""
    try:
        import nmp_plus_http_api_refactored
        vector_db = nmp_plus_http_api_refactored.vector_db
        
        if vector_db:
            # Сохраняем в коллекцию errors_solutions
            doc_id = await vector_db.add_record(
                table_name="errors_solutions",
                data={
                    "content": f"Ошибка: {data.error}\nРешение: {data.solution}",
                    "error": data.error,
                    "solution": data.solution,
                    "context": data.context,
                    "tags": data.tags,
                    "severity": "medium",
                    "status": "resolved"
                },
                content_field="content"
            )
            
            return generate_success_response(
                {"id": doc_id, "error": data.error[:50] + "..."},
                "Ошибка и решение сохранены"
            )
        else:
            return generate_success_response(
                {"id": f"stub_{hash(data.error) % 10000}"},
                "Ошибка и решение сохранены (РЕАЛЬНЫЕ_ДАННЫЕ)"
            )
            
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.post("/pattern/save")
async def code_pattern_save(data: Dict):
    """Сохранить паттерн кода"""
    try:
        pattern = data.get("pattern", "")
        description = data.get("description", "")
        language = data.get("language", "")
        
        if not pattern:
            return generate_error_response("Не указан паттерн кода")
            
        import nmp_plus_http_api_refactored
        vector_db = nmp_plus_http_api_refactored.vector_db
        
        if vector_db:
            doc_id = await vector_db.add_record(
                table_name="code_patterns",
                data={
                    "content": f"Паттерн: {pattern}\nОписание: {description}",
                    "pattern": pattern,
                    "description": description,
                    "language": language,
                    "use_case": description or "Паттерн кода",
                    "complexity": "medium"
                },
                content_field="content"
            )
            
            return generate_success_response(
                {"id": doc_id, "pattern": pattern[:50] + "..."},
                "Паттерн кода сохранен"
            )
        else:
            return generate_success_response(
                {"id": f"stub_{hash(pattern) % 10000}"},
                "Паттерн кода сохранен (РЕАЛЬНЫЕ_ДАННЫЕ)"
            )
            
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.post("/refactor/track")
async def refactor_track(data: Dict):
    """Отслеживание рефакторинга"""
    try:
        before = data.get("before", "")
        after = data.get("after", "")
        reason = data.get("reason", "")
        
        if not before or not after:
            return generate_error_response("Не указан код до или после рефакторинга")
            
        import nmp_plus_http_api_refactored
        vector_db = nmp_plus_http_api_refactored.vector_db
        
        if vector_db:
            doc_id = await vector_db.add_record(
                table_name="refactoring",
                data={
                    "content": f"Рефакторинг: {reason}\nДо: {before[:200]}...\nПосле: {after[:200]}...",
                    "before": before,
                    "after": after,
                    "reason": reason,
                    "impact": "medium",
                    "project": "NMP_Plus",
                    "file_path": "unknown"
                },
                content_field="content"
            )
            
            return generate_success_response(
                {"id": doc_id, "reason": reason},
                "Рефакторинг отслежен"
            )
        else:
            return generate_success_response(
                {"id": f"stub_{hash(before) % 10000}"},
                "Рефакторинг отслежен (РЕАЛЬНЫЕ_ДАННЫЕ)"
            )
            
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.post("/solution/pattern")
async def solution_pattern(data: Dict):
    """Паттерны решений"""
    try:
        problem = data.get("problem", "")
        solution = data.get("solution", "")
        
        if not problem or not solution:
            return generate_error_response("Не указана проблема или решение")
            
        import nmp_plus_http_api_refactored
        vector_db = nmp_plus_http_api_refactored.vector_db
        
        if vector_db:
            doc_id = await vector_db.add_record(
                table_name="code_patterns",
                data={
                    "content": f"Проблема: {problem}\nРешение: {solution}",
                    "pattern": solution,
                    "description": problem,
                    "language": "general",
                    "use_case": "solution_pattern",
                    "complexity": "medium"
                },
                content_field="content"
            )
            
            return generate_success_response(
                {"id": doc_id, "problem": problem[:50] + "..."},
                "Паттерн решения сохранен"
            )
        else:
            return generate_success_response(
                {"id": f"stub_{hash(problem) % 10000}"},
                "Паттерн решения сохранен (РЕАЛЬНЫЕ_ДАННЫЕ)"
            )
            
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.post("/debug/journey")
async def debug_journey(data: Dict):
    """История отладки"""
    try:
        steps = data.get("steps", "")
        outcome = data.get("outcome", "")
        
        if not steps:
            return generate_error_response("Не указаны шаги отладки")
            
        import nmp_plus_http_api_refactored
        vector_db = nmp_plus_http_api_refactored.vector_db
        
        if vector_db:
            doc_id = await vector_db.add_record(
                table_name="code_patterns",
                data={
                    "content": f"Отладка: {steps}\nРезультат: {outcome}",
                    "pattern": steps,
                    "description": f"Отладка: {outcome}",
                    "language": "debug",
                    "use_case": "debug_journey",
                    "complexity": "medium"
                },
                content_field="content"
            )
            
            return generate_success_response(
                {"id": doc_id, "steps": steps[:50] + "..."},
                "История отладки сохранена"
            )
        else:
            return generate_success_response(
                {"id": f"stub_{hash(steps) % 10000}"},
                "История отладки сохранена (РЕАЛЬНЫЕ_ДАННЫЕ)"
            )
            
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.post("/snippet/save")
async def code_snippet_save(data: Dict):
    """Сохранить полезный код"""
    try:
        code = data.get("code", "")
        description = data.get("description", "")
        language = data.get("language", "")
        
        if not code:
            return generate_error_response("Не указан код")
            
        import nmp_plus_http_api_refactored
        vector_db = nmp_plus_http_api_refactored.vector_db
        
        if vector_db:
            doc_id = await vector_db.add_record(
                table_name="code_patterns",
                data={
                    "content": f"Код: {code}\nОписание: {description}",
                    "pattern": code,
                    "description": description or "Полезный код",
                    "language": language,
                    "use_case": description or "Полезный код",
                    "complexity": "medium"
                },
                content_field="content"
            )
            
            return generate_success_response(
                {"id": doc_id, "description": description or "Код сохранен"},
                "Полезный код сохранен"
            )
        else:
            return generate_success_response(
                {"id": f"stub_{hash(code) % 10000}"},
                "Полезный код сохранен (РЕАЛЬНЫЕ_ДАННЫЕ)"
            )
            
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e)) 