from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from app.db.session import get_db
from app.db.models import User, Template
from app.api.deps import get_current_user
from app.api.schemas import TemplateCreate, TemplateOut
from app.utils.slug import generate_slug, make_slug_unique

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


@router.post("", response_model=TemplateOut, status_code=201)
def create_template(
    data: TemplateCreate,
    current_user: User = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    # Генерируем слаг если не указан
    if not data.slug:
        slug = generate_slug(data.name)
    else:
        slug = generate_slug(data.slug)
    
    # Проверяем уникальность слага в рамках тенанта
    existing_slugs = [
        t.slug for t in db.query(Template)
        .filter(Template.tenant_id == current_user.tenant_id)
        .all()
    ]
    unique_slug = make_slug_unique(slug, existing_slugs, current_user.tenant_id)
    
    template = Template(
        tenant_id=current_user.tenant_id,
        name=data.name,
        slug=unique_slug,
        channel_strategy=data.channel_strategy,
        # channel_config=data.channel_config or {},  # Временно закомментировано
        content=data.content,
        variables=data.variables,
    )
    db.add(template)
    db.commit()
    db.refresh(template)
    return template


@router.get("", response_model=list[TemplateOut])
def list_templates(
    current_user: User = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    """Получить все кастомные шаблоны пользователя (исключая те, что созданы автоматически для готовых шаблонов индустрии)"""
    from app.db.models import UserIndustryTemplate
    
    # Получаем ID всех Template, которые связаны с UserIndustryTemplate
    # Эти Template создаются автоматически при установке готовых шаблонов индустрии
    user_industry_template_ids = [
        ut.template_id 
        for ut in db.query(UserIndustryTemplate).filter(
            UserIndustryTemplate.tenant_id == current_user.tenant_id,
            UserIndustryTemplate.template_id.isnot(None)
        ).all()
        if ut.template_id
    ]
    
    # Получаем все Template, исключая те, что связаны с UserIndustryTemplate
    query = db.query(Template).filter(
        Template.tenant_id == current_user.tenant_id
    )
    
    if user_industry_template_ids:
        query = query.filter(~Template.id.in_(user_industry_template_ids))
    
    templates = query.all()
    return templates


@router.get("/{template_id}", response_model=TemplateOut)
def get_template(
    template_id: int,
    current_user: User = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    template = (
        db.query(Template)
        .filter(Template.id == template_id, Template.tenant_id == current_user.tenant_id)
        .first()
    )
    if not template:
        raise HTTPException(status_code=404, detail="Template not found")
    return template


@router.put("/{template_id}", response_model=TemplateOut)
def update_template(
    template_id: int,
    data: TemplateCreate,
    current_user: User = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    template = (
        db.query(Template)
        .filter(Template.id == template_id, Template.tenant_id == current_user.tenant_id)
        .first()
    )
    if not template:
        raise HTTPException(status_code=404, detail="Template not found")
    
    # Генерируем слаг если не указан
    if not data.slug:
        slug = generate_slug(data.name)
    else:
        slug = generate_slug(data.slug)
    
    # Проверяем уникальность слага (исключая текущий шаблон)
    existing_slugs = [
        t.slug for t in db.query(Template)
        .filter(Template.tenant_id == current_user.tenant_id, Template.id != template_id)
        .all()
    ]
    unique_slug = make_slug_unique(slug, existing_slugs, current_user.tenant_id)
    
    # Обновляем поля
    template.name = data.name
    template.slug = unique_slug
    template.channel_strategy = data.channel_strategy
    # template.channel_config = data.channel_config or {}  # Временно закомментировано
    template.content = data.content
    template.variables = data.variables
    
    db.commit()
    db.refresh(template)
    return template




