<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\SeccionesRequest;
use App\Http\Resources\DefaultResource;
use Illuminate\Http\Request;
use App\Models\Admin\Secciones;
use App\Models\Image;
use App\Models\ImageSetting;
use App\Models\ThumbnailSetting;
use App\Models\TiposSecciones;
use App\Services\UploadedImageService;
use App\Traits\SummernoteTrait;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Storage;

use function PHPUnit\Framework\isFinite;

class SeccionesController extends Controller
{
    use SummernoteTrait;

    public function store(SeccionesRequest $request, UploadedImageService $uploadedImageService): DefaultResource
    {
        //TODO: POLITICAS
        //? Al guardar se hara de forma de borrador
        //? el mismo sera habilitado una vez publicada la interna
        //* En el caso de ediciones: sera guardado de esta forma solo las nuevas secciones

        $input = $request->all();
        $imagen = $input['imagen'];

        $tipoSeccion = TiposSecciones::where('id', $input['tipo_seccion_id'])
            ->first();

        //*Si es texto enriquecido
        if ($tipoSeccion->texto_enriquecido) {
            //Si requiere texto enriquecido
            $descripcion = $request->input('descripcion');

            $format_html = $this->formatSummernote($descripcion, Secciones::class);

            $input = array_merge($input, [
                'descripcion' => $format_html->descripcion
            ]);
        }

        unset($input['imagen']);
        unset($input['borrador']);

        //*Store
        $result = Secciones::create($input);


        //*Si necesita subir imagen
        if ($tipoSeccion->imagen_upload) {
            if ($tipoSeccion->multiple_imagen && is_array($imagen) && sizeof($imagen)) {
                $imagenes = $imagen;
                foreach ($imagenes as $imagen) {
                    if (is_file($imagen))
                        $uploadedImageService
                            ->setFile($imagen)
                            ->setRelatedModel($result)
                            ->move()
                            ->createThumbnails()
                            ->storeRelationship();
                }
            } else if (!$tipoSeccion->multiple_imagen && is_file($imagen)) {
                if ($request->hasFile('imagen'))
                    $uploadedImageService
                        ->setFile($request->file('imagen'))
                        ->setRelatedModel($result)
                        ->move()
                        ->createThumbnails()
                        ->storeRelationship();
            }
        }


        if ($tipoSeccion->texto_enriquecido)
            $this->optimizeImageSummernote($format_html->imagenes, Secciones::class, $result->id);

        return DefaultResource::make($result);
    }

    public function update(SeccionesRequest $request, UploadedImageService $uploadedImageService, $id): DefaultResource
    {
        //TODO: POLITICAS
        //? Al modificar se va a mantener su estado activo
        //? esté o no guardado la interna
        //? Solo "SI ESTABA ACTIVO ANTERIORMENTE"

        $input = request()->all();

        $tipoSeccion = TiposSecciones::where('id', $input['tipo_seccion_id'])
            ->first();

        $imagen = $input['imagen'];

        //*Si es texto enriquecido
        if ($tipoSeccion->texto_enriquecido) {
            //Si requiere texto enriquecido
            $descripcion = $request->input('descripcion');

            $format_html = $this->formatSummernote($descripcion, Secciones::class);

            $input = array_merge($input, [
                'descripcion' => $format_html->descripcion
            ]);
        }

        unset($input['imagen']);

        $result = Secciones::find($id);
        $result->fill($input)->save();

        //*Si necesita subir imagen
        if ($tipoSeccion->imagen_upload) {
            if (!$tipoSeccion->multiple_imagen) {
                if (is_file($imagen))
                    $uploadedImageService
                        ->setFile($imagen)
                        ->setRelatedModel($result)
                        ->move()
                        ->createThumbnails()
                        ->replaceFirst();
            } else if (is_array($imagen)) {
                //*Imagenes existentes (url's)
                $imagen_existente = request('imagen_existente', []);

                //*Seleccionamos antes los registros (para que no cuenten los nuevos)
                $images_en_bd =  Image::where('imageable_type', Secciones::class)
                    ->where('imageable_id', $id)
                    ->latest()
                    ->get();

                //*Guardamos las nuevas imagenes
                foreach ($imagen as $img) {
                    if (is_file($img))
                        $uploadedImageService
                            ->setFile($img)
                            ->setRelatedModel($result)
                            ->move()
                            ->createThumbnails()
                            ->storeRelationship();
                }

                //*Validamos los existentes
                //! Y los que serán eliminados
                foreach ($imagen_existente as $img) {
                    foreach ($images_en_bd as $k => $item) {
                        if (strpos($img, $item->name)) {
                            unset($images_en_bd[$k]);
                            break;
                        }
                    }
                }

                //*Si tenemos existentes en bd entonces hay que eliminar los archivos y
                //*los registros
                if (sizeof($images_en_bd)) {
                    $settings = ImageSetting::where('type', Secciones::class)
                        ->latest()
                        ->first();

                    $thumbnail_settings = ThumbnailSetting::where('image_settings_id', $settings->id)
                        ->get();

                    foreach ($images_en_bd as $k => $item) {
                        foreach ($thumbnail_settings as $ts) {
                            $to_delete = "public/{$settings->upload_to}/{$item->name}@{$ts->size}.{$item->ext}";
                            Storage::delete($to_delete);
                            Image::where('id', $item->id)
                                ->delete();
                        }
                    }
                }
            }
        }

        if ($tipoSeccion->texto_enriquecido)
            $this->optimizeImageSummernote($format_html->imagenes, Secciones::class, $result->id);


        return DefaultResource::make($result);
    }


    //***************************************/
    //?        FUNCTIONS BY INTERNA
    //***************************************/

    public function listarByInterna($interna_id)
    {
        return Secciones::where('interna_id', $interna_id)
            ->ordenar()
            ->orderByDesc('id') 
            ->selectFillableAnd(['id as image_large_getter'])
            ->get();
    }

    public function updateOrderByInterna($interna_id)
    {
        $data = request()->all();
        foreach ($data as $key => $item) {
            Secciones::where('id', $item['id'])
                ->where('interna_id', $interna_id)
                ->update([
                    'orden' => $key + 1
                ]);
        }
    }

    public function deleteByInterna($interna_id, $id): Response
    {
        $this->deleteSummernoteImages(Secciones::class, $id, true);
        Secciones::find($id)->delete();


        $this->ordenar($interna_id);
        return response()->noContent();
    }

    private function ordenar($interna_id)
    {
        $data = Secciones::where('interna_id', $interna_id)
            ->ordenar()
            ->select('id')
            ->get();

        foreach ($data as $key => $item) {
            Secciones::where('id', $item->id)
                ->where('interna_id', $interna_id)
                ->update([
                    'orden' => $key + 1
                ]);
        }
    }

    public function extraerImagen($texto): string | array
    {
        preg_match_all('/data:image\/(.*);base64,(.*)/', $texto, $matches);

        foreach ($matches[1] as $index => $type) {
            $data = base64_decode($matches[2][$index]);
            $fileName = "image" . $index . "." . $type;

            file_put_contents($fileName, $data);
        }
        for ($i = 0; $i < count($matches[2]); $i++) {
            $text = str_replace($matches[0][$i], '/' . $fileName, $texto);
        }

        return $text;

        return [];
    }
}
