from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session

from app.api.deps import get_db
from app.api.permissions import require_create, require_delete, require_read, require_update
from app.models import User
from app.services.template_manager import TemplateManager

from common_logging import get_logger

logger = get_logger(__name__)

router = APIRouter(tags=['templates'])

@router.get('/')
def get_templates(task_type: str=None, db: Session=Depends(get_db), current_user: User=Depends(require_read('templates'))):
    manager = TemplateManager(db)
    return manager.get_templates(current_user.tenant_id, task_type)

@router.get('/{template_id}')
def get_template(template_id: int, db: Session=Depends(get_db), current_user: User=Depends(require_read('templates'))):
    manager = TemplateManager(db)
    template = manager.get_template(template_id)
    if not template:
        raise HTTPException(status_code=404, detail='Template not found')
    return template

@router.post('/')
def create_template(name: str, description: str, task_type: str, platform: str, config: dict, is_public: bool=False, db: Session=Depends(get_db), current_user: User=Depends(require_create('templates'))):
    manager = TemplateManager(db)
    result = manager.create_template(name, description, task_type, platform, config, is_public, current_user.tenant_id, current_user.id)
    logger.bind(template_id=result.get("id")).info("Template created")
    return result

@router.put('/{template_id}')
def update_template(template_id: int, name: str=None, description: str=None, config: dict=None, is_public: bool=None, db: Session=Depends(get_db), current_user: User=Depends(require_update('templates'))):
    manager = TemplateManager(db)
    updates = {k: v for k, v in locals().items() if v is not None and k not in ['template_id', 'db', 'current_user', 'manager']}
    template = manager.update_template(template_id, **updates)
    if not template:
        raise HTTPException(status_code=404, detail='Template not found')
    logger.bind(template_id=template_id).info("Template updated")
    return template

@router.delete('/{template_id}')
def delete_template(template_id: int, db: Session=Depends(get_db), current_user: User=Depends(require_delete('templates'))):
    manager = TemplateManager(db)
    success = manager.delete_template(template_id)
    if not success:
        raise HTTPException(status_code=404, detail='Template not found')
    logger.bind(template_id=template_id).info("Template deleted")
    return {'message': 'Template deleted'}
