"""User controller for handling HTTP requests."""
from flask import request, jsonify, redirect, url_for, flash
from app.services.user_service import UserService
from app.views.user_view import UserView

class UserController:
    """Controller for user-related HTTP requests."""
    
    def __init__(self):
        self.user_service = UserService()
        self.user_view = UserView()
    
    def index(self):
        """Handle GET /users - List all users."""
        page = request.args.get('page', 1, type=int)
        per_page = request.args.get('per_page', 10, type=int)
        search = request.args.get('search', None)
        
        return self.user_view.render_user_list(page=page, per_page=per_page, 
                                              search_query=search)
    
    def show(self, user_id: int):
        """Handle GET /users/<id> - Show user details."""
        return self.user_view.render_user_detail(user_id)
    
    def create_form(self):
        """Handle GET /users/new - Show create user form."""
        return self.user_view.render_user_form()
    
    def create(self):
        """Handle POST /users - Create new user."""
        data = request.form
        
        user, error = self.user_service.create_user(
            username=data.get('username'),
            email=data.get('email'),
            first_name=data.get('first_name'),
            last_name=data.get('last_name')
        )
        
        if error:
            flash(error, 'error')
            return self.user_view.render_user_form()
        
        flash('User created successfully!', 'success')
        return redirect(url_for('user.show', user_id=user['id']))
    
    def edit_form(self, user_id: int):
        """Handle GET /users/<id>/edit - Show edit user form."""
        return self.user_view.render_user_form(user_id=user_id)
    
    def update(self, user_id: int):
        """Handle PUT/POST /users/<id> - Update user."""
        data = request.form
        
        user, error = self.user_service.update_user(
            user_id=user_id,
            email=data.get('email'),
            first_name=data.get('first_name'),
            last_name=data.get('last_name')
        )
        
        if error:
            flash(error, 'error')
            return self.user_view.render_user_form(user_id=user_id)
        
        flash('User updated successfully!', 'success')
        return redirect(url_for('user.show', user_id=user_id))
    
    def delete(self, user_id: int):
        """Handle DELETE /users/<id> - Delete user."""
        success, error = self.user_service.delete_user(user_id)
        
        if error:
            flash(error, 'error')
        else:
            flash('User deleted successfully!', 'success')
        
        return redirect(url_for('user.index'))
    
    def api_list(self):
        """Handle GET /api/users - API endpoint for user list."""
        page = request.args.get('page', 1, type=int)
        per_page = request.args.get('per_page', 10, type=int)
        
        result = self.user_service.get_all_users(page=page, per_page=per_page)
        return jsonify(result)
    
    def api_show(self, user_id: int):
        """Handle GET /api/users/<id> - API endpoint for user details."""
        user = self.user_service.get_user(user_id)
        if not user:
            return jsonify({'error': 'User not found'}), 404
        return jsonify(user)

