<?php

namespace App\Jobs;

use Ajaxray\PHPWatermark\Watermark;
use App\Models\Access;
use App\Models\Gallery;
use App\Models\Image;
use App\Models\Tenant;
use Gumlet\ImageResize;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;

class ResizeImageBackup implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;


    private $image_id;
    private $size;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(int $image_id, int $size)
    {
        $this->image_id = $image_id;
        $this->size = $size;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $image = Image::query()->where("id", "=", $this->image_id)->firstOrFail();
        $gallery = Gallery::query()->where("id", "=", $image->gallery)->firstOrFail();
        $tenant = Tenant::query()->where("id", "=", $gallery->tenant)->firstOrFail();
        $cacheName = "cache/".$tenant->url."_".$gallery->url."_".$image->id;

        //Check if orginal size is cached on the current system
        if (Storage::disk('cache')->exists($cacheName."_orginal")) {
            $file = Storage::disk("cache")->get($cacheName."_orginal");
        } else {
            $this->addAccessLog($tenant->id, $gallery->id, $image->id, "Access", $image->size);
            $file = Storage::disk($image->driver)->get($image->path);
            if(env("CACHE_ORGINAL"))
            {
                Storage::disk("cache")->put($cacheName."_orginal", $file);
            }
        }

        $image = ImageResize::createFromString($file);
        $image->resizeToLongSide($this->size, true);

        //Watermark
        Storage::disk("cache")->put($cacheName."_".$this->size, $image->getImageAsString(IMAGETYPE_JPEG, 100));
    }



    private function addAccessLog(int $tenant, int $gallery, int $image, string $typ, int $size) {
        $access = new Access();
        $access->year = date("Y");
        $access->month = date("m");
        $access->day = date("d");
        $access->hour = date("H");
        $access->image = $image;
        $access->gallery = $gallery;
        $access->tenant = $tenant;
        $access->typ = $typ;
        $access->size = $size;
        $access->saveOrFail();
    }
}
