from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse

from app.api.v1 import (
    datasets,
    dpo_tasks,
    experts,
    sft_tasks,
    tasks,
    templates,
    tools,
    training_platforms,
    websocket,
)
from app.core.config import settings
from common_logging import LoggingMiddleware, get_logger, setup_logging
from common_metrics import setup_metrics

setup_logging()
logger = get_logger(__name__)
app = FastAPI(title='Expert Training Service', version='1.0.0')
logger.info('Starting Expert Training Service v1.0.0')
app.add_middleware(LoggingMiddleware)
setup_metrics(app, "training-center")
app.add_middleware(CORSMiddleware, allow_origins=settings.CORS_ORIGINS, allow_credentials=True, allow_methods=['*'], allow_headers=['*'])

@app.exception_handler(ValueError)
async def value_error_handler(request: Request, exc: ValueError):
    logger.warning(f"Validation error: {exc}")
    return JSONResponse(status_code=400, content={'detail': str(exc)})

@app.exception_handler(PermissionError)
async def permission_error_handler(request: Request, exc: PermissionError):
    return JSONResponse(status_code=403, content={'detail': str(exc)})

@app.exception_handler(Exception)
async def general_exception_handler(request: Request, exc: Exception):
    logger.exception(f"Unhandled error: {exc}")
    return JSONResponse(status_code=500, content={'detail': 'Internal server error'})
app.include_router(tasks.router, prefix='/api/v1/tasks', tags=['tasks'])
app.include_router(experts.router, prefix='/api/v1/experts', tags=['experts'])
app.include_router(datasets.router, prefix='/api/v1/datasets', tags=['datasets'])
app.include_router(tools.router, prefix='/api/v1/tools', tags=['tools'])
app.include_router(sft_tasks.router, prefix='/api/v1/sft-tasks', tags=['sft_tasks'])
app.include_router(dpo_tasks.router, prefix='/api/v1/dpo-tasks', tags=['dpo_tasks'])
app.include_router(templates.router, prefix='/api/v1/templates', tags=['templates'])
app.include_router(training_platforms.router, prefix='/api/v1/training-platforms', tags=['training_platforms'])
app.include_router(websocket.router, tags=['websocket'])

@app.get('/')
async def root():
    return {'service': 'Expert Training Service', 'version': '1.0.0', "status":"running"}

@app.get('/health')
async def health_check():
    return {'status': 'healthy'}
