from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from app.database import get_db from app.models.habit import HabitStatus, HabitType from app.models.user import User from app.schemas.habit import HabitCreate, HabitOut, HabitReorderRequest, HabitUpdate from app.schemas.habit_log import HabitStats from app.security import require_login from app.services import habit_service, log_service router = APIRouter(prefix="/api/habits", tags=["habits"], dependencies=[Depends(require_login)]) def _get_habit_or_404(db: Session, habit_id: int, user_id: int): habit = habit_service.get_habit(db, habit_id, user_id) if habit is None: raise HTTPException(status_code=404, detail="습관을 찾을 수 없습니다") return habit @router.get("", response_model=list[HabitOut]) def list_habits( type: HabitType | None = None, status: HabitStatus | None = None, db: Session = Depends(get_db), current_user: User = Depends(require_login), ): return habit_service.list_habits(db, current_user.id, habit_type=type, status=status) @router.post("", response_model=HabitOut, status_code=201) def create_habit( data: HabitCreate, db: Session = Depends(get_db), current_user: User = Depends(require_login) ): return habit_service.create_habit(db, current_user.id, data) @router.post("/reorder") def reorder_habits( data: HabitReorderRequest, db: Session = Depends(get_db), current_user: User = Depends(require_login) ): habit_service.reorder_habits(db, current_user.id, data.habit_ids) return {"ok": True} @router.get("/{habit_id}", response_model=HabitOut) def get_habit(habit_id: int, db: Session = Depends(get_db), current_user: User = Depends(require_login)): return _get_habit_or_404(db, habit_id, current_user.id) @router.put("/{habit_id}", response_model=HabitOut) def update_habit( habit_id: int, data: HabitUpdate, db: Session = Depends(get_db), current_user: User = Depends(require_login) ): habit = _get_habit_or_404(db, habit_id, current_user.id) return habit_service.update_habit(db, habit, data) @router.delete("/{habit_id}", status_code=204) def delete_habit(habit_id: int, db: Session = Depends(get_db), current_user: User = Depends(require_login)): habit = _get_habit_or_404(db, habit_id, current_user.id) habit_service.delete_habit(db, habit) @router.post("/{habit_id}/complete", response_model=HabitOut) def complete_habit(habit_id: int, db: Session = Depends(get_db), current_user: User = Depends(require_login)): habit = _get_habit_or_404(db, habit_id, current_user.id) return habit_service.complete_habit(db, habit) @router.post("/{habit_id}/reactivate", response_model=HabitOut) def reactivate_habit(habit_id: int, db: Session = Depends(get_db), current_user: User = Depends(require_login)): habit = _get_habit_or_404(db, habit_id, current_user.id) return habit_service.reactivate_habit(db, habit) @router.get("/{habit_id}/stats", response_model=HabitStats) def get_habit_stats(habit_id: int, db: Session = Depends(get_db), current_user: User = Depends(require_login)): habit = _get_habit_or_404(db, habit_id, current_user.id) return log_service.get_habit_stats(db, habit)