<?php

namespace App\Http\Controllers;

use App\Services\UserService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;

class UserController extends Controller
{
    protected $userService;

    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }

    /**
     * Mostrar lista de usuarios
     */
    public function index(Request $request)
    {
        try {
            $token = Session::get('api_token');
            $this->userService->setToken($token);

            $filters = $request->only(['search', 'role', 'status']);
            $users = $this->userService->getUsers($filters);

            return view('users.index', compact('users', 'filters'));

        } catch (\Exception $e) {
            return view('users.index')->with('error', 'Error al cargar usuarios: ' . $e->getMessage());
        }
    }

    /**
     * Mostrar formulario para crear usuario
     */
    public function create()
    {
        try {
            $token = Session::get('api_token');
            $this->userService->setToken($token);

            $roles = $this->userService->getRoles();

            return view('users.create', compact('roles'));

        } catch (\Exception $e) {
            return redirect()->route('users.index')->with('error', 'Error al cargar formulario: ' . $e->getMessage());
        }
    }

    /**
     * Guardar nuevo usuario
     */
    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|max:255',
            'password' => 'required|string|min:8',
            'role_id' => 'required|integer'
        ]);

        try {
            $token = Session::get('api_token');
            $this->userService->setToken($token);

            $userData = $request->only(['name', 'email', 'password', 'role_id']);
            $user = $this->userService->createUser($userData);

            return redirect()->route('users.index')->with('success', 'Usuario creado exitosamente.');

        } catch (\Exception $e) {
            return back()->withErrors(['error' => 'Error al crear usuario: ' . $e->getMessage()])->withInput();
        }
    }

    /**
     * Mostrar detalles de un usuario
     */
    public function show($id)
    {
        try {
            $token = Session::get('api_token');
            $this->userService->setToken($token);

            $user = $this->userService->getUser($id);
            $roles = $this->userService->getRoles();

            return view('users.show', compact('user', 'roles'));

        } catch (\Exception $e) {
            return redirect()->route('users.index')->with('error', 'Error al cargar usuario: ' . $e->getMessage());
        }
    }

    /**
     * Mostrar formulario para editar usuario
     */
    public function edit($id)
    {
        try {
            $token = Session::get('api_token');
            $this->userService->setToken($token);

            $user = $this->userService->getUser($id);
            $roles = $this->userService->getRoles();

            return view('users.edit', compact('user', 'roles'));

        } catch (\Exception $e) {
            return redirect()->route('users.index')->with('error', 'Error al cargar usuario: ' . $e->getMessage());
        }
    }

    /**
     * Actualizar usuario
     */
    public function update(Request $request, $id)
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|max:255',
            'role_id' => 'required|integer'
        ]);

        try {
            $token = Session::get('api_token');
            $this->userService->setToken($token);

            $userData = $request->only(['name', 'email', 'role_id']);
            if ($request->filled('password')) {
                $userData['password'] = $request->password;
            }

            $this->userService->updateUser($id, $userData);

            return redirect()->route('users.index')->with('success', 'Usuario actualizado exitosamente.');

        } catch (\Exception $e) {
            return back()->withErrors(['error' => 'Error al actualizar usuario: ' . $e->getMessage()])->withInput();
        }
    }

    /**
     * Eliminar usuario
     */
    public function destroy($id)
    {
        try {
            $token = Session::get('api_token');
            $this->userService->setToken($token);

            $this->userService->deleteUser($id);

            return redirect()->route('users.index')->with('success', 'Usuario eliminado exitosamente.');

        } catch (\Exception $e) {
            return redirect()->route('users.index')->with('error', 'Error al eliminar usuario: ' . $e->getMessage());
        }
    }
}