<?php

namespace kernel\app_modules\photo;

use Illuminate\Database\Eloquent\Model;
use itguild\forms\builders\FileBuilder;
use kernel\app_modules\photo\models\Photo;
use kernel\app_modules\photo\service\PhotoService;
use kernel\FileUpload;
use kernel\helpers\Html;
use kernel\Module;
use kernel\modules\menu\service\MenuService;
use kernel\Request;
use kernel\services\MigrationService;

class PhotoModule extends Module
{

    public MenuService $menuService;
    public MigrationService $migrationService;

    public function __construct()
    {
        $this->menuService = new MenuService();
        $this->migrationService = new MigrationService();
    }

    /**
     * @throws \Exception
     */
    public function init(): void
    {
        $this->migrationService->runAtPath("{KERNEL_APP_MODULES}/photo/migrations");

        $this->menuService->createItem([
            "label" => "Фото",
            "url" => "/admin/photo",
            "slug" => "photo",
        ]);

        $this->menuService->createItem([
            "label" => "Фото",
            "url" => "/admin/settings/photo",
            "slug" => "photo_settings",
            "parent_slug" => "settings"
        ]);
    }

    public function deactivate(): void
    {
        $this->menuService->removeItemBySlug("photo");
        $this->menuService->removeItemBySlug("photo_settings");
    }

    public function formInputs(string $entity, Model $model = null): void
    {
        if (isset($model->id)) {
            $value = PhotoService::getByEntity($entity, $model->id);
            echo Html::img($value, ['width' => '200px']);
        }
        $input = FileBuilder::build("image", [
            'class' => 'form-control',
            'value' => $value ?? '',
        ]);
        $input->setLabel("Фото");
        $input->create()->render();
    }

    public function saveInputs(string $entity, Model $model, Request $request): void
    {
        Photo::where("entity", $entity)->where("entity_id", $model->id)->delete();

        if (isset($_FILES['image']) && $_FILES['image']['error'] === UPLOAD_ERR_OK) {
            $file = new FileUpload($_FILES['image'], ['jpg', 'jpeg', 'png']);
            $file->upload();
            $image = $file->getUploadFile();
            $photo = new Photo();
            $photo->entity = $entity;
            $photo->entity_id = $model->id;
            $photo->image = $image;
            $photo->save();
        }
    }


    public function getItems(string $entity, Model $model): array|string
    {
        $photos = Photo::where("entity", $entity)->where("entity_id", $model->id)->get();
        $photoStr = "";
        foreach ($photos as $photo) {
            $photoStr .= "<img src='$photo->image' width='150px'>" . " ";
        }

        return substr($photoStr, 0, -1);
    }

    public function getItem(string $entity, string $entity_id): string
    {
        $photos = Photo::where("entity", $entity)->where("entity_id", $entity_id)->get();
        $photoStr = "";
        foreach ($photos as $photo) {
            $photoStr .= "<img src='$photo->image' width='150px'>" . " ";
        }

        return substr($photoStr, 0, -1);
    }

    public function deleteItems(string $entity, Model $model): void
    {
        Photo::where("entity", $entity)->where("entity_id", $model->id)->delete();
    }
}