<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Intervention\Image\Facades\Image as InterventionImage;
use App\Models\Image as ImageModel;

class ImageController extends Controller
{
    public function store(Request $request)
    {
        // Validar que el request contiene una imagen válida
        $validator = Validator::make($request->all(), [
            'image' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048',
        ]);

        if ($validator->fails()) {
            return response()->json(['error' => 'Invalid image'], 400);
        }

        // Obtener la imagen del request
        $image = $request->file('image');
        $time = time();

        // Generar un nombre único para la imagen
        $imageName = $time . '.' . $image->getClientOriginalExtension();

        // Guardar la imagen en la carpeta pública
        $image->move(public_path('images'), $imageName);

        // Guardar la referencia a la imagen en la base de datos
        $imageModel = new ImageModel();
        $imageModel->path = '/images/' . $imageName;
        $imageModel->name = $time;
        $imageModel->save();

        return response()->json(['name' => $time]);
    }

    public function show($name)
    {
        $image = ImageModel::where('name', $name)->first();

        if (!$image) {
            return response()->json(['message' => 'Image not found'], 404);
        }

        // Obtiene los parámetros de alto y ancho de la consulta GET
        $width = request()->query('width');
        $height = request()->query('height');

        // Verifica si se proporcionaron valores válidos para alto y ancho
        if (!(empty($width) && empty($height))) {
            if (!is_numeric($width) || !is_numeric($height)) {
                return response()->json(['error' => 'Width and height must be numeric'], 400);
            }
        }

        // Ruta de la imagen original
        $imagePath = public_path($image->path);

        // Verifica si la imagen existe
        if (!file_exists($imagePath)) {
            return response()->json(['error' => 'Image File not found'], 404);
        }

        // Abre la imagen usando Intervention Image
        $image = InterventionImage::make($imagePath);

        // Redimensiona la imagen con el aspecto de la relación
        if (!empty($width) && !empty($height)) {
            $image->resize($width, $height, function ($constraint) {
                $constraint->aspectRatio();
            });
        }

        // Crea una respuesta de Laravel con el contenido de la imagen redimensionada
        $response = response()->stream(
            function () use ($image) {
                echo $image->encode('jpg');
            },
            200,
            ['Content-Type' => 'image/jpeg']
        );

        return $response;
    }
}
