from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from sqlalchemy import update, delete
from typing import List, Optional

from database import get_db
from models import TicketAutomation, User
from schemas import TicketAutomationCreate, TicketAutomationUpdate, TicketAutomationResponse
from auth import get_current_user, require_roles

router = APIRouter(prefix="/api/v1/automations", tags=["Automations"])

@router.get("/", response_model=List[TicketAutomationResponse])
async def get_automations(db: AsyncSession = Depends(get_db), current_user: User = Depends(require_roles(["Administrador"]))):
    stmt = select(TicketAutomation).where(TicketAutomation.company_id == current_user.company_id).order_by(TicketAutomation.id)
    res = await db.execute(stmt)
    return res.scalars().all()

@router.post("/", response_model=TicketAutomationResponse)
async def create_automation(auto: TicketAutomationCreate, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_roles(["Administrador"]))):
    new_auto = TicketAutomation(
        name=auto.name,
        conditions_json=auto.conditions_json,
        actions_json=auto.actions_json,
        is_active=auto.is_active
    )
    db.add(new_auto)
    await db.commit()
    await db.refresh(new_auto)
    return new_auto

@router.put("/{auto_id}", response_model=TicketAutomationResponse)
async def update_automation(auto_id: int, auto: TicketAutomationUpdate, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_roles(["Administrador"]))):
    stmt = select(TicketAutomation).where(TicketAutomation.company_id == current_user.company_id).where(TicketAutomation.id == auto_id)
    res = await db.execute(stmt)
    db_auto = res.scalar_one_or_none()
    if not db_auto:
        raise HTTPException(status_code=404, detail="Automation not found")
        
    if auto.name is not None: db_auto.name = auto.name
    if auto.conditions_json is not None: db_auto.conditions_json = auto.conditions_json
    if auto.actions_json is not None: db_auto.actions_json = auto.actions_json
    if auto.is_active is not None: db_auto.is_active = auto.is_active
    
    await db.commit()
    await db.refresh(db_auto)
    return db_auto

@router.delete("/{auto_id}")
async def delete_automation(auto_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_roles(["Administrador"]))):
    stmt = delete(TicketAutomation).where(TicketAutomation.id == auto_id)
    await db.execute(stmt)
    await db.commit()
    return {"message": "Automation deleted"}
