<?php

namespace App\Http\Requests\Admin;

use App\Models\TiposSecciones;
use App\Traits\ConvertsBase64ToFiles;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;

class SeccionesRequest extends FormRequest
{
    use ConvertsBase64ToFiles;

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    private $attr = 'data.attributes.';


    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {

        $tipo_seccion_id = $this->input('tipo_seccion_id');
        if ($tipo_seccion_id) {
            return $this->getRules($tipo_seccion_id);
        }
        abort(404, 'Necesita todos los datos');
    }


    private function getRules($tipo_seccion_id)
    {
        $ret = [
            'titulo' => 'required|max:255|min:3',
            'interna_id' => 'required|numeric|min:1'
        ];
        $result = DB::table('secciones_validaciones')
            ->where('tipo_seccion_id', $tipo_seccion_id)
            ->select('campo', 'validacion')
            ->get();

        $tipo_seccion = $this->getTipoSeccion();

        foreach ($result as $item) {
            $ret = array_merge($ret, [
                $item->campo => $item->validacion
            ]);
        }

        $isUpdate = $this->method() === 'PUT' || $this->method() === 'PATCH';
        $dimensiones_imagen = Rule::dimensions()->minWidth(196)->minHeight(80);

        //*Para imagenes
        if ($tipo_seccion->imagen_upload) {
            if ($tipo_seccion->multiple_imagen) {
                $ret = array_merge($ret, [
                    'imagen' => $isUpdate ? 'nullable|array' : 'required|array|min:2',
                    'imagen.*' => [
                        'image',
                        'mimes:jpg,jpeg,png,webp',
                        $dimensiones_imagen,
                        'max:5000',
                    ],
                    'total_imagen' => 'required|numeric|min:2'
                ]);
            } else if (!$isUpdate || ($isUpdate && is_file($this->input('imagen')))) {
                $ret = array_merge($ret, [
                    'imagen' => [
                        $isUpdate ? 'nullable' : 'required',
                        'image',
                        'mimes:jpg,jpeg,png,webp',
                        $dimensiones_imagen,
                        'max:5000',
                    ]
                ]);
            }
        }

        return $ret;
    }

    protected function prepareForValidation()
    {
        $input = $this->input('data.attributes');

        $isUpdate = $this->method() === 'PUT' || $this->method() === 'PATCH';
        $tipo_seccion = $this->getTipoSeccion();

        if (!$tipo_seccion)
            abort(404, 'Todos los campos necesarios');

        if ($tipo_seccion->imagen_upload) {
            if ($tipo_seccion->multiple_imagen) {
                $input['imagen'] = $input['imagenes'];
                $input['total_imagen'] = sizeof($input['imagen']);
            }
            unset($input['imagenes']);
        } else {
            if (in_array('imagen', $input))
                unset($input['imagen']);
            if (in_array('imagenes', $input))
                unset($input['imagenes']);
        }

        //if method
        if ($isUpdate && isset($input['imagen']) && is_array($input['imagen'])) {
            $imagen = [];
            $imagen_existente = [];
            foreach ($input['imagen'] as $img) {
                if (isImageBase64($img)) {
                    $imagen[] = $img;
                } else {
                    $imagen_existente[] = $img;
                }
            }
            $input = array_merge($input, [
                'imagen' => $imagen,
                'imagen_existente' => $imagen_existente
            ]);
        }


        //*Booleans Keys
        $isImageMultiple = $tipo_seccion->imagen_upload && $tipo_seccion->multiple_imagen;
        $isValidUniqueImage = !$isImageMultiple && isset($input['imagen']) && is_string($input['imagen']) && isImageBase64($input['imagen']);
        $isValidMultipleImage = $isImageMultiple && isset($input['imagen']) && is_array($input['imagen']);

        $this->replace($input ?? []);

        if ($tipo_seccion->imagen_upload)
            if (!$isUpdate || ($isUpdate && ($isValidUniqueImage || $isValidMultipleImage)))
                $this->convertImgBase64ExistsToFiles();

        $input = $this->all();
        $this->replace($input ?? []);

        //$this->replace($input ?? []);
    }

    private function validateFiles(array $imagenes)
    {
        $existente = [];
        $nuevo = [];
        foreach ($imagenes as $imagen) {
            if (is_file($imagen)) {
                $nuevo[] = $imagen;
                continue;
            }
            $existente[] = $imagen;
        }
        return (object) [
            'existente' => $existente,
            'nuevo' => $nuevo
        ];
    }

    protected function base64FileKeys(): array
    {
        return ['imagen'];
    }

    private function getTipoSeccion()
    {
        $id = $this->input('data.attributes.tipo_seccion_id', null);
        $id = $id ? $id : $this->input('tipo_seccion_id');
        return TiposSecciones::where('id', $id)
            ->first();
    }
}
