"""
User service for business logic.
Handles user profile management and user operations.
"""

import logging
from typing import List

from fastapi import HTTPException, status
from sqlalchemy.orm import Session

from models import User
from schemas import UserUpdate, UserResponse, UserListResponse
from auth_utils import get_password_hash

logger = logging.getLogger(__name__)


class UserService:
    """Service for user operations."""
    
    @staticmethod
    def get_user_by_email(email: str, db: Session) -> User:
        """Get user by email."""
        return db.query(User).filter(User.email == email).first()
    
    @staticmethod
    def get_user_by_id(user_id: int, db: Session) -> User:
        """Get user by ID."""
        user = db.query(User).filter(User.id == user_id).first()
        if not user:
            raise HTTPException(
                status_code=status.HTTP_404_NOT_FOUND,
                detail="User not found"
            )
        return user
    
    @staticmethod
    def update_user_profile(
        user_data: UserUpdate,
        current_user: User,
        db: Session
    ) -> UserResponse:
        """Update user profile information."""
        # Check if new email is already taken
        if user_data.email and user_data.email != current_user.email:
            if db.query(User).filter(User.email == user_data.email).first():
                raise HTTPException(
                    status_code=status.HTTP_400_BAD_REQUEST,
                    detail="User with this email already exists"
                )
        
        # Update user data
        if user_data.name is not None:
            current_user.name = user_data.name
        if user_data.email is not None:
            current_user.email = user_data.email
        
        db.commit()
        db.refresh(current_user)
        
        return UserResponse.from_orm(current_user)
    
    @staticmethod
    def get_all_users(db: Session, skip: int = 0, limit: int = 100) -> UserListResponse:
        """Get all users with pagination."""
        users = db.query(User).offset(skip).limit(limit).all()
        total = db.query(User).count()
        
        return UserListResponse(
            users=[UserResponse.from_orm(user) for user in users],
            total=total
        )
    
    @staticmethod
    def create_user_by_admin(user_data, db: Session) -> UserResponse:
        """Create new user by admin."""
        # Check if user already exists
        if db.query(User).filter(User.email == user_data.email).first():
            raise HTTPException(
                status_code=status.HTTP_400_BAD_REQUEST,
                detail="User with this email already exists"
            )
        
        # Create new user
        new_user = User(
            email=user_data.email,
            name=user_data.name,
            password=get_password_hash(user_data.password),
            user_type=user_data.user_type,
            rate=user_data.rate,
            paid=user_data.paid,
            next_payment_date=user_data.next_payment_date
        )
        
        db.add(new_user)
        db.commit()
        db.refresh(new_user)
        
        return UserResponse.from_orm(new_user)
    
    @staticmethod
    def update_user_by_admin(
        user_id: int,
        user_data,
        db: Session
    ) -> UserResponse:
        """Update user by admin."""
        user = db.query(User).filter(User.id == user_id).first()
        if not user:
            raise HTTPException(
                status_code=status.HTTP_404_NOT_FOUND,
                detail="User not found"
            )
        
        # Check if new email is already taken
        if user_data.email and user_data.email != user.email:
            if db.query(User).filter(User.email == user_data.email).first():
                raise HTTPException(
                    status_code=status.HTTP_400_BAD_REQUEST,
                    detail="User with this email already exists"
                )
        
        # Update user data
        update_fields = [
            ('name', user_data.name),
            ('email', user_data.email),
            ('rate', user_data.rate),
            ('user_type', user_data.user_type),
            ('paid', user_data.paid),
            ('next_payment_date', user_data.next_payment_date)
        ]
        
        for field, value in update_fields:
            if value is not None:
                setattr(user, field, value)
        
        db.commit()
        db.refresh(user)
        
        return UserResponse.from_orm(user)
    
    @staticmethod
    def delete_user_by_admin(user_id: int, current_admin: User, db: Session) -> dict:
        """Delete user by admin."""
        user = db.query(User).filter(User.id == user_id).first()
        if not user:
            raise HTTPException(
                status_code=status.HTTP_404_NOT_FOUND,
                detail="User not found"
            )
        
        # Prevent self-deletion
        if user.id == current_admin.id:
            raise HTTPException(
                status_code=status.HTTP_400_BAD_REQUEST,
                detail="Cannot delete yourself"
            )
        
        db.delete(user)
        db.commit()
        
        return {"message": "User deleted successfully", "success": True} 