<?php

namespace App\Http\Controllers\Master;

use App\Http\Controllers\Controller;
use App\Models\Company;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\Password;
use Illuminate\View\View;

/**
 * Usuários de todas as empresas, na visão do master.
 *
 * Serve ao suporte: destravar acesso, redefinir senha e promover alguém a
 * administrador sem precisar entrar como cliente.
 */
class UsuarioGlobalController extends Controller
{
    public function index(Request $request): View
    {
        $busca = trim((string) $request->query('q', ''));
        $empresaId = $request->query('empresa', '');

        $usuarios = User::query()
            ->with('company')
            ->when($busca, fn ($q) => $q->where(fn ($sub) => $sub
                ->where('name', 'like', "%{$busca}%")
                ->orWhere('email', 'like', "%{$busca}%")))
            ->when($empresaId, fn ($q) => $q->where('company_id', $empresaId))
            ->orderByRaw("CASE WHEN role = 'master' THEN 0 ELSE 1 END")
            ->orderBy('name')
            ->paginate(25)
            ->withQueryString();

        return view('master.usuarios', [
            'usuarios' => $usuarios,
            'empresas' => Company::orderBy('razao_social')->get(['id', 'razao_social']),
            'busca' => $busca,
            'empresaId' => $empresaId,
        ]);
    }

    public function store(Request $request): RedirectResponse
    {
        $dados = $request->validate([
            'company_id' => ['required', 'exists:companies,id'],
            'name' => ['required', 'string', 'max:120'],
            'email' => ['required', 'email', 'max:180', Rule::unique('users', 'email')],
            'role' => ['required', Rule::in([User::ROLE_ADMIN, User::ROLE_USER])],
            'password' => ['required', Password::min(8)->letters()->numbers()],
        ], [], ['name' => 'nome', 'email' => 'e-mail', 'password' => 'senha', 'company_id' => 'empresa']);

        User::create($dados);

        return back()->with('status', 'Usuário criado.');
    }

    public function update(Request $request, User $usuario): RedirectResponse
    {
        // A conta master não é gerenciada por aqui: rebaixá-la ou desativá-la
        // por engano trancaria o acesso à plataforma.
        abort_if($usuario->isMaster(), 403, 'Contas master não são editáveis por esta tela.');

        $dados = $request->validate([
            'name' => ['required', 'string', 'max:120'],
            'role' => ['required', Rule::in([User::ROLE_ADMIN, User::ROLE_USER])],
            'is_active' => ['boolean'],
            'password' => ['nullable', Password::min(8)->letters()->numbers()],
        ], [], ['name' => 'nome', 'password' => 'senha']);

        $usuario->fill([
            'name' => $dados['name'],
            'role' => $dados['role'],
            'is_active' => $request->boolean('is_active'),
        ]);

        if (filled($dados['password'] ?? null)) {
            $usuario->password = $dados['password'];
        }

        $usuario->save();

        return back()->with('status', 'Usuário atualizado.');
    }

    public function destroy(User $usuario): RedirectResponse
    {
        abort_if($usuario->isMaster(), 403, 'Contas master não são removíveis por esta tela.');

        $usuario->delete();

        return back()->with('status', 'Usuário removido.');
    }
}
