<?php

namespace App\Http\Controllers;

use App\Models\User;
use App\Models\Escola;
use App\Models\Aluno;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rule;
use Spatie\Permission\Models\Role;
use Spatie\Permission\PermissionRegistrar;


class UsersController extends Controller
{
    public function index()
    {
        $usuarios = User::all();
        return view('usuarios.index', compact('usuarios'));
    }




    public function rolesByEscola(Request $request, $escolaId)
    {
        $user = auth()->user();

        if (!$user->is_super_admin) {
            $allowed = $user->escolas()->where('escolas.id', $escolaId)->exists();
            abort_if(!$allowed, 403);
        }

        // roles por escola
        $roles = Role::query()
            ->where('id_escola', $escolaId)
            ->orderBy('name')
            ->get(['id', 'name']);

        return response()->json($roles);
    }

    public function alunosByEscola(Request $request, $escolaId)
    {
        $user = auth()->user();

        if (!$user->is_super_admin) {
            $allowed = $user->escolas()->where('escolas.id', $escolaId)->exists();
            abort_if(!$allowed, 403);
        }

        // alunos por escola (sem global scope, se necessário)
        $alunos = Aluno::query()
            ->withoutGlobalScope('escola') // se seu Aluno usa BelongsToEscola, isso evita filtrar errado
            ->where('id_escola', $escolaId)
            ->orderBy('nome')
            ->get(['id', 'nome']);

        return response()->json($alunos);
    }


public function store(Request $request)
{
    // validação base
    $data = $request->validate([
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'email', 'max:255', 'unique:users,email'],
        'password' => ['required', 'string', 'min:6', 'confirmed'],

        'escola_id' => ['nullable', 'integer', 'exists:escolas,id'],
        'role_name' => ['nullable', 'string'], // coordenacao/secretaria/responsavel/aluno/representante_de_turma
        'is_super_admin' => ['nullable', 'boolean'],

        // aluno (1)
        'aluno_id' => ['nullable', 'integer', 'exists:alunos,id'],

        // responsável (N)
        'aluno_ids' => ['nullable', 'array'],
        'aluno_ids.*' => ['integer', 'exists:alunos,id'],
    ]);

    $isSuper = (bool)($data['is_super_admin'] ?? false);

    // super admin não precisa escola/role
    if ($isSuper) {
        $data['escola_id'] = null;
        $data['role_name'] = null;
        $data['aluno_id'] = null;
        $data['aluno_ids'] = [];
    } else {
        if (empty($data['escola_id']) || empty($data['role_name'])) {
            return back()->withErrors(['escola_id' => 'Selecione escola e cargo.'])->withInput();
        }
    }

    // valida vínculo de aluno conforme cargo
    if (!$isSuper && $data['role_name'] === 'aluno') {

        if (empty($data['aluno_id'])) {
            return back()->withErrors(['aluno_id' => 'Selecione o aluno para vincular.'])->withInput();
        }

        $ok = Aluno::query()
            ->withoutGlobalScope('escola')
            ->where('id', $data['aluno_id'])
            ->where('id_escola', $data['escola_id'])
            ->exists();

        if (!$ok) {
            return back()->withErrors(['aluno_id' => 'Aluno não pertence à escola selecionada.'])->withInput();
        }
    }

    if (!$isSuper && $data['role_name'] === 'responsavel') {

        $alunoIds = $request->input('aluno_ids', []);
        if (count($alunoIds) === 0) {
            return back()->withErrors(['aluno_ids' => 'Selecione pelo menos 1 aluno.'])->withInput();
        }

        // valida se TODOS os alunos pertencem à escola selecionada
        $count = Aluno::query()
            ->withoutGlobalScope('escola')
            ->whereIn('id', $alunoIds)
            ->where('id_escola', $data['escola_id'])
            ->count();

        if ($count !== count($alunoIds)) {
            return back()->withErrors(['aluno_ids' => 'Um ou mais alunos não pertencem à escola selecionada.'])->withInput();
        }

        $data['aluno_ids'] = $alunoIds;
    }

    app(PermissionRegistrar::class)->forgetCachedPermissions();

    // cria usuário
    $user = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
        'is_super_admin' => $isSuper,
        'current_escola_id' => $data['escola_id'] ?? null,
    ]);

    // vincula à escola (pivot user_escolas) + role por escola
    if (!$isSuper && $user->current_escola_id) {

        $user->escolas()->syncWithoutDetaching([$user->current_escola_id]);

        // seta team e atribui role da escola
        setPermissionsTeamId($user->current_escola_id);

        $role = Role::query()
            ->where('name', $data['role_name'])
            ->where('guard_name', 'web')
            ->where('id_escola', $user->current_escola_id)
            ->firstOrFail();

        $user->syncRoles([$role]);

        // ✅ associações automáticas
        if ($data['role_name'] === 'aluno') {
            Aluno::query()
                ->withoutGlobalScope('escola')
                ->where('id', $data['aluno_id'])
                ->update(['user_id' => $user->id]);
        }

        if ($data['role_name'] === 'responsavel') {
            // pivot aluno_responsaveis (N:N)
            $user->alunosComoResponsavel()->syncWithoutDetaching($data['aluno_ids'] ?? []);
        }
    }

    app(PermissionRegistrar::class)->forgetCachedPermissions();
    setPermissionsTeamId(null);

    return back()->with('success', 'Usuário criado com sucesso!');
}


}
