from fastapi import APIRouter, Depends, HTTPException, Body from pydantic import BaseModel, EmailStr, validator from typing import Optional from werkzeug.security import generate_password_hash from app.database.database_query import DatabaseQuery from app.middleware.auth import get_current_user router = APIRouter() query = DatabaseQuery() class ProfileUpdateRequest(BaseModel): email: Optional[EmailStr] = None password: Optional[str] = None name: Optional[str] = None age: Optional[int] = None @validator('password') def password_length(cls, v): if v is not None and len(v) < 6: raise ValueError('Password must be at least 6 characters') return v @validator('age') def age_range(cls, v): if v is not None and (v < 13 or v > 120): raise ValueError('Age must be between 13 and 120') return v @router.get('/profile') async def get_profile(username: str = Depends(get_current_user)): try: user = query.get_user_profile(username) if not user: raise HTTPException(status_code=404, detail="User not found") return { 'username': user['username'], 'email': user['email'], 'name': user['name'], 'age': user['age'], 'created_at': user['created_at'] } except Exception as e: if isinstance(e, HTTPException): raise e raise HTTPException(status_code=500, detail=str(e)) @router.put('/profile') async def update_profile( update_data: ProfileUpdateRequest = Body(...), username: str = Depends(get_current_user) ): try: update_fields = {} if update_data.email: if not query.is_valid_email(update_data.email): raise HTTPException(status_code=400, detail="Invalid email format") update_fields['email'] = update_data.email if update_data.password: update_fields['password'] = generate_password_hash(update_data.password) if update_data.name: update_fields['name'] = update_data.name if update_data.age is not None: update_fields['age'] = update_data.age if update_fields: if query.update_user_profile(username, update_fields): return {"message": "Profile updated successfully"} return {"message": "No changes made"} except Exception as e: if isinstance(e, HTTPException): raise e raise HTTPException(status_code=500, detail=str(e)) @router.delete('/profile') async def delete_account(username: str = Depends(get_current_user)): try: if query.delete_user_account(username): return {"message": "Account deleted successfully"} raise HTTPException(status_code=404, detail="User not found") except Exception as e: if isinstance(e, HTTPException): raise e raise HTTPException(status_code=500, detail=str(e)) @router.delete('/delete-account-permanently') async def delete_account_permanently(username: str = Depends(get_current_user)): try: result = query.delete_account_permanently(username) if result['success']: return { 'message': 'Account and all associated data deleted successfully', 'details': result['deleted_data'] } else: raise HTTPException(status_code=500, detail="Failed to delete account") except Exception as e: if isinstance(e, HTTPException): raise e raise HTTPException(status_code=500, detail=str(e))