<?php

namespace App\Lib;

use Illuminate\Http\Request;
use App\Modelos\Admin\ImageSize;
use Image;
use Spatie\ImageOptimizer\OptimizerChainFactory;
use File;

class ImageUploader
{

    public function store($request, $programId, $imageNewName, $lstImagenes, $size = '', $fileSrc = '', $file)
    {
        // dd('image');
        $extension = $file->extension();

        //Si estamos pasando una url desde el summernote
        if (!empty($fileSrc)) {
            $file = $fileSrc;
        }

        if (!empty($size)) {
            $originalX = $size[0];
            $originalY = $size[1];
        } else {
            //Obtenemos las dimensiones de la imagen cargada en el formulario
            $tamanoOriginalImagen = getimagesize($file);
            //            dd($tamanoOriginalImagen);
            $originalX = $tamanoOriginalImagen[0];
            $originalY = $tamanoOriginalImagen[1];
        }

        //Obtenemos el ratio de la imagen cargada por el usuario
        $ratioOriginal = round(($originalX / $originalY), 1);
        foreach ($lstImagenes as $imagen) {
            // Crea el directorio de almacenamiento si no existe
            $directoryPath = public_path($imagen->directorio);
            if (!File::exists($directoryPath)) {
                File::makeDirectory($directoryPath, 0755, true);
            }
            if ($originalX > $originalY) {
                $adicionar_x = $originalX + 300;
                $adicionar_y = $originalY + 500;
            } else {
                //Espacio a adicionar al tapiz de la imagen con tamanho mayor (full);
                $adicionar_x = $originalX + 500;
                $adicionar_y = $originalY + 300;
            }



            $ratioRequerido = round(($imagen->size_x / $imagen->size_y), 1);
            //dd($ratioRequerido);

            if ($imagen->full == 1) {
                // dd('entro en el de imagen full..');
                //si el tamaño de la imagen original no supera el el ancho y alto de
                // tamaño requerido se sube la imagen sin redimensionar para no perder
                // calidad
                //Instanciamos la clase
                $img = Image::make($file);

                // Si la imagen supera el ancho o alto esperado se redimenciona conservando el ratio
                if ($originalX > $imagen->size_x or $originalY > $imagen->size_y) {
                    // dd('entra en el if si el ancho o alto es superior al esperado');
                    $img->resize($imagen->size_x, $imagen->size_y, function ($constraint) {
                        $constraint->aspectRatio();
                        $constraint->upsize();
                    });
                }

                if (($originalX < $imagen->size_x or $originalY < $imagen->size_y or $ratioOriginal <> $ratioRequerido) && false) {

                    if ($extension == 'png') {
                        //Agrandamos el contorno de la imagen si es png para permitir
                        // hacer zoom out sin perder la transparencia
                        $img = Image::canvas($originalX + $adicionar_x, $originalY + $adicionar_y, 'rgba(255,255,255,0)')
                            ->insert($img, 'center');
                        $imagen2 = "$imagen->directorio" . "$imagen->titulo" . "_" . "$imageNewName";
                        //dd($imagen2);
                        $img->save(public_path($imagen2), 100);
                    } else if ($extension == 'gif') {

                        $imagen2 = "$imagen->directorio" . "$imagen->titulo" . "_" . "$imageNewName";
                        copy($file->getRealPath(), public_path($imagen2));
                        //$width = $file->width();
                        //$height = $file->height();
                        //$file->destroy();
                    } else {
                        $imagen2 = "$imagen->directorio" . "$imagen->titulo" . "_" . "$imageNewName";

                        //Nueva instancia para la imagen a agregar al contorno
                        $image = Image::make($file);
                        $image->blur(40);
                        $image->resize($adicionar_x, $adicionar_y);
                        // imagecopymerge($image, $img, 50, 50, 0, 0, $originalX-100, $originalY-100, 100);
                        $image->insert($img, 'center');
                        // $img->save(public_path($imagen2), 100);
                        $image->save(public_path($imagen2), 100);
                    }

                    //Guardamos la imagen, con calidad 100%
                    //Pasa la ruta para optimizar la imagen una vez cargada

                    //imagejpeg($image,public_path($imagen2, 100));
                    //imagedestroy($image);

                    // $optimizerChain = OptimizerChainFactory::create();
                    // $optimizerChain->optimize($_SERVER['DOCUMENT_ROOT'].$imagen2);


                    //dd('subida sin redimencionar');
                } else {
                    // si la imagen supera el tamanho esperado redimensionamos
                    // teniendo en cuenta solo el ancho maximo

                    //Instanciamos la clase
                    //$img = Image::make($file);

                    //Realizamos el corte
                    //$img->resize($imagen->size_x, '');

                    $img->resize($imagen->size_x, null, function ($constraint) {
                        $constraint->aspectRatio();
                        $constraint->upsize();
                    });
                    /*if ($extension == 'png') {
                        //Agrandamos el contorno de la imagen si es png para permitir
                        // hacer zoom out sin perder la transparencia
                        $adicional_x = $imagen->size_x -

                        Image::canvas($imagen->size_x * 2, $imagen->size_y * 2, 'rgba(255,255,255,0)')
                                ->insert($img);
                    }*/

                    //Guardamos la imagen, con calidad 100%
                    //Pasa la ruta para optimizar la imagen una vez cargada
                    $imagen2 = "$imagen->directorio" . "$imagen->titulo" . "_" . "$imageNewName";
                    $img->save(public_path($imagen2), 100);
                    // $optimizerChain = OptimizerChainFactory::create();
                    // $optimizerChain->optimize($_SERVER['DOCUMENT_ROOT'].$imagen2);
                }
            } else {

                //dd($imagen);
                if ($extension == 'gif' && $imagen->padreMiniatura == null) {

                    $imagen2 = "$imagen->directorio" . "$imagen->titulo" . "_" . "$imageNewName";
                    copy($file->getRealPath(), public_path($imagen2));
                    //$width = $file->width();
                    //$height = $file->height();
                    //$file->destroy();

                } else {
                    //dd('subida de cortes');
                    //Instanciamos la clase
                    $img = Image::make($file);

                    //Realizamos el corte
                    $img->fit($imagen->size_x, $imagen->size_y);

                    //Guardamos la imagen
                    //Pasa la ruta para optimizar la imagen una vez cargada
                    $imagen2 = "$imagen->directorio" . "$imagen->titulo" . "_" . "$imageNewName";
                    $img->save(public_path($imagen2), 100);
                    // $optimizerChain = OptimizerChainFactory::create();
                    // $optimizerChain->optimize($_SERVER['DOCUMENT_ROOT'].$imagen2);
                }
            }
        }
    }
}
