<?php

namespace App\DataTables;

use App\Models\Piatto;
use App\Models\PiattoHasAllergene;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Validation\Rule;
use Yajra\DataTables\DataTablesEditor;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;
use Storage;
use Illuminate\Support\Str;

class PiattoDataTableEditor extends DataTablesEditor
{
  protected $model = Piatto::class;
  // protected $uploadDir = '';
  // protected $disk = 'modelliRicevute';

  protected $messages = [
    'nome.required' => 'Il nome è richiesto',
    'descrizione.required' => 'La descrizione è richiesta',
    'prezzo.required' => 'Il prezzo è richiesto',
    'immagine.required' => 'L\'immagine è richiesta',
    'disponibile.required' => 'Indicare una delle due opzioni',
    'allergeni.required' => 'Indicare una delle due opzioni',
    'bacheca_id.required' => 'Indicare una delle due opzioni',
    'in_evidenza.required' => 'Indicare una delle due opzioni',
    'cucina_id.required' => 'La cucina è richiesta',
  ];

  /**
  * Get create action validation rules.
  *
  * @return array
  */
  public function createRules(): array
  {
    return [
      'nome'  => 'required',
      // 'descrizione' => 'required',
      'prezzo' => 'required',
      'cucina_id' => 'required|exists:cucina,id',
      'immagine' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
      'disponibile' => 'nullable|boolean', // unchecked = non inviato → null; normalizzato a false in creating()
      'allergeni' => 'nullable|array',
      'allergeni.*' => 'integer|exists:allergene,id',
      'bacheca_id' => 'nullable|boolean',
      'in_evidenza' => 'nullable|boolean',
    ];
  }

  public function createMessages(): array{
    return $this->messages;
  }

  /**
  * Get edit action validation rules.
  *
  * @param Model $model
  * @return array
  */
  public function editRules(Model $model): array
  {
    return [
      'nome'  => 'required',
      'descrizione' => 'nullable',
      'cucina_id' => 'required|exists:cucina,id',
      'prezzo' => 'required',
      'immagine' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
      'disponibile' => 'nullable|boolean',
      'allergeni' => 'nullable|array',
      'allergeni.*' => 'integer|exists:allergene,id',
      'bacheca_id' => 'nullable|boolean',
      'in_evidenza' => 'nullable|boolean',
    ];
  }

  public function editMessages(): array{
    return $this->messages;
  }

  /**
  * Get remove action validation rules.
  *
  * @param Model $model
  * @return array
  */
  public function removeRules(Model $model): array
  {
    return [];
  }

  public function creating(Model $model, array $data): array
  {
    // L'Editor manda `allergeni` come array di ID selezionati:
    // salviamo la relazione nella pivot `piatto_allergene`, non nella colonna `piatto.allergeni`.
    $data['_allergeni_ids'] = $this->normalizeAllergeniIds($data['allergeni'] ?? null);
    unset($data['allergeni']);

    $data['bacheca_id'] = isset($data['bacheca_id']) ? true : false;
    $data['in_evidenza'] = isset($data['in_evidenza']) ? true : false;
    $data['disponibile'] = isset($data['disponibile']) ? true : false;
    return $data;
  }

  public function updating(Model $model, array $data): array
  {
    $data['_allergeni_ids'] = $this->normalizeAllergeniIds($data['allergeni'] ?? null);
    unset($data['allergeni']);

    $data['bacheca_id'] = isset($data['bacheca_id']) ? true : false;
    $data['in_evidenza'] = isset($data['in_evidenza']) ? true : false;
    $data['disponibile'] = isset($data['disponibile']) ? true : false;

    return $data;
  }

  protected function normalizeAllergeniIds(null|array|string $value): array
  {
    if (is_null($value)) {
      return [];
    }

    if (is_string($value)) {
      $value = array_filter(array_map('trim', explode(',', $value)));
    }

    if (! is_array($value)) {
      return [];
    }

    // Normalizza a int, rimuove vuoti e duplicati.
    $value = array_values(array_unique(array_map(static fn ($id) => (int) $id, $value)));

    return array_values(array_filter($value, static fn ($id) => $id > 0));
  }

  public function saved(Model $model, array $data): Model
  {
    if (! array_key_exists('_allergeni_ids', $data)) {
      return $model;
    }

    $ids = $this->normalizeAllergeniIds($data['_allergeni_ids']);

    // Re-sincronizza tutti gli allergeni per questo piatto.
    PiattoHasAllergene::where('piatto_id', $model->id)->delete();

    if (! empty($ids)) {
      $rows = array_map(static function ($allergeneId) use ($model) {
        return [
          'piatto_id' => $model->id,
          'allergene_id' => $allergeneId,
        ];
      }, $ids);

      PiattoHasAllergene::insert($rows);
    }

    return $model;
  }
  public function messages(): array
  {
    return $this->messages;
  }

}
