<?php

namespace App\Http\Controllers;

use App\Models\Gruppo;
use App\Models\Individuo;
use App\Models\Ruolo;
use Illuminate\Http\Request;

class GruppoMembroController extends Controller
{
    public function store(Request $request, $gruppo)
    {
        $this->authorizeWrite('gruppi');
        $this->authorizeRead('individui');
        $gruppo = Gruppo::findOrFail($gruppo);

        $data = $request->validate([
            'individuo_id' => 'required|exists:individui,id',
            'ruolo_ids' => 'nullable|array',
            'ruolo_ids.*' => 'exists:ruoli,id',
            'data_adesione' => 'nullable|date',
        ]);

        if ($gruppo->individui()->where('individuo_id', $data['individuo_id'])->exists()) {
            if ($request->ajax() || $request->expectsJson()) {
                return response()->json(['error' => 'Questo individuo è già membro di questo gruppo.'], 422);
            }
            return redirect()->back()->with('error', 'Questo individuo è già membro di questo gruppo.');
        }

        $gruppo->individui()->attach($data['individuo_id'], [
            'ruolo_ids' => !empty($data['ruolo_ids']) ? json_encode(array_values($data['ruolo_ids'])) : null,
            'data_adesione' => $data['data_adesione'] ?? null,
        ]);

        if ($request->ajax() || $request->expectsJson()) {
            return response()->json(['success' => 'Membro aggiunto con successo.']);
        }
        return redirect()->back()->with('success', 'Membro aggiunto con successo.');
    }

    public function update(Request $request, $gruppo, $individuo)
    {
        $this->authorizeWrite('gruppi');
        $gruppo = Gruppo::findOrFail($gruppo);

        $data = $request->validate([
            'ruolo_ids' => 'nullable|array',
            'ruolo_ids.*' => 'exists:ruoli,id',
            'data_adesione' => 'nullable|date',
        ]);

        $gruppo->individui()->updateExistingPivot($individuo, [
            'ruolo_ids' => !empty($data['ruolo_ids']) ? json_encode(array_values($data['ruolo_ids'])) : null,
            'data_adesione' => $data['data_adesione'] ?? null,
        ]);

        return redirect()->back()->with('success', 'Membro aggiornato con successo.');
    }

    public function destroy($gruppo, $individuo)
    {
        $this->authorizeDelete('gruppi');
        $gruppo = Gruppo::findOrFail($gruppo);
        $gruppo->individui()->detach($individuo);

        if (request()->ajax() || request()->expectsJson()) {
            return response()->json(['success' => 'Membro rimosso dal gruppo.']);
        }
        return redirect()->back()->with('success', 'Membro rimosso dal gruppo.');
    }
}