<?php

namespace App\DataTables;

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

class ContenutoBachecaDataTableEditor extends DataTablesEditor
{
  protected $model = ContenutoBacheca::class;
  protected string $uploadDir = '';
  protected string $disk = 'contenuti_bacheca';

  protected $messages = [
    'nome.required' => 'Il nome dell\'elemento è richiesto',
    'descrizione.nullable' => 'La descrizione dell\'elemento è facoltativa',
    'immagine.nullable' => 'L\'immagine dell\'elemento è facoltativa',
    // 'immagine.image' => 'L\'immagine dell\'elemento deve essere un\'immagine',
    // 'immagine.mimes' => 'L\'immagine dell\'elemento deve essere un\'immagine in formato jpeg, png, jpg, gif, svg',
    'immagine.max' => 'L\'immagine dell\'elemento deve essere minore di 2MB',
    ];

  /**
  * Get create action validation rules.
  *
  * @return array
  */
  public function createRules(): array
  {
    return [
      'nome'  => 'required',
      'descrizione' => 'nullable',
      // 'immagine' => 'nullable|mimes:jpeg,png,jpg,gif,svg|max:2048',
      'immagine' => 'nullable|max:2048',
    ];
  }

  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',
      // 'immagine' => 'nullable|mimes:jpeg,png,jpg,gif,svg|max:2048',
      'immagine' => 'nullable|max:2048',
    ];
  }

  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
  {
    return $data;
  }

  public function updating(Model $model, array $data): array
  {

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

  public function upload(Request $request): JsonResponse
  
  
  {
    $this->action = 'upload';

    $field   = $request->input('uploadField');
    $storage = Storage::disk($this->disk);

    try {
      $rules      = $this->uploadRules();
      $fieldRules = ['upload' => data_get($rules, $field, [])];

      $this->validate($request, $fieldRules, $this->messages(), $this->attributes());

      $uploadedFile = $request->file('upload');
      $filename     = $this->getUploadedFilename($field, $uploadedFile);
      $id           = $storage->putFileAs($request->id, $uploadedFile, $filename);

      if (method_exists($this, 'uploaded')) {
        $id = $this->uploaded($id);
      }

      return response()->json([
        'action' => $this->action,
        'data'   => [],
        'files'  => [
          'files' => [
            $id => [
              'filename'      => $id,
              'original_name' => $uploadedFile->getClientOriginalName(),
              'size'          => $uploadedFile->getSize(),
              'directory'     => $request->id,
              'disk'          => $this->disk,
              'url'           => $storage->url($id),
            ],
          ],
        ],
        'upload' => [
          'id' => $id,
        ],
      ]);
    } catch (ValidationException $exception) {
      return response()->json([
        'action'      => $this->action,
        'data'        => [],
        'fieldErrors' => [
          [
            'name'   => $field,
            'status' => str_replace('upload', $field, $exception->errors()['upload'][0]),
          ],
        ],
      ]);
    }
  }

}
