<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Attivita;
use App\Models\ChiusuraServizio;
use App\DataTables\ChiusuraServizioDataTable;
use App\DataTables\ChiusuraServizioDataTableEditor;
use App\Services\Bilancio\BilancioServizioService;
use Carbon\Carbon;
use Illuminate\Routing\Controllers\Middleware;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;

class ChiusuraServizioController extends Controller
{
  public static $permission_group = "Chiusura Servizio";
  public static $permissions = [
    'view-chiusura-servizio' => 'Vedi',
    'create-chiusura-servizio' => 'Crea',
    'edit-chiusura-servizio' => 'Modifica',
    'delete-chiusura-servizio' => 'Elimina',
  ];

  public static function middleware(): array
  {
    return [
      new Middleware('permission:view-chiusura-servizio', only: ['index', 'show']),
      new Middleware('permission:create-chiusura-servizio', only: ['chiudi_servizio']),
      new Middleware('permission:create-chiusura-servizio|edit-chiusura-servizio|delete-chiusura-servizio', only: ['store', 'update', 'destroy']),
    ];
  }

  public function index(ChiusuraServizioDataTable $dataTable)
  {
      $dataTable->attivita_id = Session::get('attivita_attuale');
        return $dataTable->render('chiusura_servizio.index');
  }

  public function store(ChiusuraServizioDataTableEditor $editor){
      $request = request();
      $input = $request->all();
      if($request->has('action')){
          switch($input['action']){
              case 'create':
                  if(!Auth::user()->can('create-chiusura-servizio')) return;
                  break;
              case 'edit':
                  if(!Auth::user()->can('edit-chiusura-servizio')) return;
                  break;
              case 'delete':
                  if(!Auth::user()->can('delete-chiusura-servizio')) return;
                  break;
          }
      }
      return $editor->process($request);
  }

  public function show(Request $request, BilancioServizioService $bilancioServizio)
  {
    $chiusura = ChiusuraServizio::query()
      ->with(['user', 'attivita'])
      ->where('attivita_id', Session::get('attivita_attuale'))
      ->find($request->get('chiusura_servizio_id'));

    if (!$chiusura) {
      return redirect()->route('chiusura-servizio.index')->with('error', 'Chiusura non trovata');
    }

    $snapshot = is_array($chiusura->info) ? $chiusura->info : (json_decode($chiusura->info ?? '[]', true) ?: []);
    $periodoDa = !empty($snapshot['periodo']['da']) ? Carbon::parse($snapshot['periodo']['da']) : null;
    $periodoA = !empty($snapshot['periodo']['a'])
      ? Carbon::parse($snapshot['periodo']['a'])
      : $chiusura->chiusura_at;

    $heatmap = $bilancioServizio->heatmapFromSnapshot(
      (int) $chiusura->attivita_id,
      $snapshot,
      $periodoDa,
      $periodoA
    );

    return view('chiusura_servizio.show', [
      'chiusura' => $chiusura,
      'snapshot' => $snapshot,
      'periodoDa' => $periodoDa,
      'periodoA' => $periodoA,
      'paymentSummary' => collect($snapshot['pagamenti_per_metodo'] ?? []),
      'cucineRows' => $bilancioServizio->cucineWithOrario($snapshot, $heatmap['heatmapSeries']),
      'totaleIncasso' => (float) ($snapshot['incasso'] ?? 0),
      'totaleTransazioni' => (int) ($snapshot['transazioni'] ?? 0),
      'totPiattiOrdinati' => (int) ($snapshot['piatti_ordinati'] ?? 0),
      'heatmapHourLabels' => $heatmap['heatmapHourLabels'],
    ]);
  }

  public function chiudi_servizio(Request $request, BilancioServizioService $bilancioServizio)
  {
    if (!Auth::user()->can('create-chiusura-servizio')) {
      return redirect()->back()->with('error', 'Non autorizzato');
    }

    $attivitaId = (int) ($request->input('attivita_id') ?: Session::get('attivita_attuale'));
    $attivita = Attivita::find($attivitaId);
    if (!$attivita) {
      return redirect()->back()->with('error', 'Attività non trovata');
    }

    $chiusuraAt = now();
    $periodStart = $bilancioServizio->periodStartForAttivita($attivitaId, $chiusuraAt);

    ChiusuraServizio::create([
      'attivita_id' => $attivitaId,
      'user_id' => Auth::id(),
      'chiusura_at' => $chiusuraAt,
      'note' => $request->input('note', 'Chiusura servizio'),
      'info' => $bilancioServizio->buildSnapshot($attivitaId, $periodStart, $chiusuraAt),
    ]);

    return redirect()->back()->with('success', 'Servizio chiuso con successo');
  }
}
