from typing import List from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from datetime import datetime from app.db.session import get_db from app.models.user import User from app.models.task import Task, TaskStatus from app.api.schemas import TaskCreate, TaskUpdate, TaskResponse from app.core.auth import get_current_user from app.services.ai_service import suggest_optimal_time from app.services.whatsapp_service import send_task_reminder router = APIRouter() @router.post("/", response_model=TaskResponse) def create_task( task: TaskCreate, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): ai_suggested_time = None if task.due_date and not task.scheduled_at: ai_suggested_time = suggest_optimal_time(task.due_date, task.priority) db_task = Task( title=task.title, description=task.description, priority=task.priority, due_date=task.due_date, scheduled_at=task.scheduled_at, ai_suggested_time=ai_suggested_time, owner_id=current_user.id ) db.add(db_task) db.commit() db.refresh(db_task) return db_task @router.get("/", response_model=List[TaskResponse]) def get_tasks( skip: int = 0, limit: int = 100, status: TaskStatus = None, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): query = db.query(Task).filter(Task.owner_id == current_user.id) if status: query = query.filter(Task.status == status) tasks = query.offset(skip).limit(limit).all() return tasks @router.get("/{task_id}", response_model=TaskResponse) def get_task( task_id: int, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): task = db.query(Task).filter( Task.id == task_id, Task.owner_id == current_user.id ).first() if not task: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Task not found" ) return task @router.put("/{task_id}", response_model=TaskResponse) def update_task( task_id: int, task_update: TaskUpdate, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): task = db.query(Task).filter( Task.id == task_id, Task.owner_id == current_user.id ).first() if not task: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Task not found" ) update_data = task_update.dict(exclude_unset=True) if task_update.status == TaskStatus.COMPLETED and task.status != TaskStatus.COMPLETED: update_data["completed_at"] = datetime.utcnow() for field, value in update_data.items(): setattr(task, field, value) db.commit() db.refresh(task) return task @router.delete("/{task_id}") def delete_task( task_id: int, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): task = db.query(Task).filter( Task.id == task_id, Task.owner_id == current_user.id ).first() if not task: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Task not found" ) db.delete(task) db.commit() return {"message": "Task deleted successfully"} @router.post("/{task_id}/send-reminder") def send_reminder( task_id: int, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): task = db.query(Task).filter( Task.id == task_id, Task.owner_id == current_user.id ).first() if not task: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Task not found" ) if not current_user.whatsapp_number: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="WhatsApp number not configured" ) success = send_task_reminder(current_user.whatsapp_number, task) if success: task.whatsapp_reminder_sent = True db.commit() return {"message": "Reminder sent successfully"} else: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Failed to send reminder" )