<?php

namespace App\Observers;

use App\Events\InformaciaCreatedEvent;
use App\Events\InformaciaZverejnenaEvent;
use App\Models\Informacia\Enums\StavInformacieEnum;
use App\Models\Informacia\Informacia;

/**
 * Class InformaciaObserver
 *
 * Trieda observer pre model Informacia, ktora sleduje vytvorenie
 * a aktualizaciu informacii a spusta prislusne notifikacie
 *
 * @package App\Observers
 * @author Radoslav Lukac <dev@seka.sk>
 */
class InformaciaObserver
{
    /**
     * Metóda sa spustí pred vytvorením informácie
     *
     * @param Informacia $informacia
     * @return void
     */
    public function creating(Informacia $informacia): void
    {
        // Tu môžete pridať logiku, ktorá sa má vykonať pred vytvorením záznamu
    }

    /**
     * Metóda spracuje vytvorenie novej informácie
     *
     * @param Informacia $informacia Vytvorená informácia
     * @return void
     */
    public function created(Informacia $informacia): void
    {
        if ($informacia->stav === StavInformacieEnum::ZVEREJNENA()) {
            InformaciaCreatedEvent::dispatch($informacia);
            InformaciaZverejnenaEvent::dispatch($informacia);
        }
    }

    /**
     * Metóda sa spustí pred aktualizáciou informácie
     *
     * @param Informacia $informacia
     * @return void
     */
    public function updating(Informacia $informacia): void
    {
        // Tu môžete pridať logiku, ktorá sa má vykonať pred aktualizáciou záznamu
    }

    /**
     * Metóda spracuje aktualizáciu existujúcej informácie
     *
     * @param Informacia $informacia Aktualizovaná informácia
     * @return void
     */
    public function updated(Informacia $informacia): void
    {
        if ($informacia->stav === StavInformacieEnum::ZVEREJNENA() && $informacia->wasChanged(
                'stav',
            ) && $informacia->cas_zverejnenia != null && $informacia->wasChanged('cas_zverejnenia')) {
            InformaciaZverejnenaEvent::dispatch($informacia);
        }
    }

    /**
     * Metóda sa spustí pred vymazaním informácie
     *
     * @param Informacia $informacia
     * @return void
     */
    public function deleting(Informacia $informacia): void
    {
        // Tu môžete pridať logiku, ktorá sa má vykonať pred vymazaním záznamu
    }

    /**
     * Metóda sa spustí po vymazaní informácie
     *
     * @param Informacia $informacia
     * @return void
     */
    public function deleted(Informacia $informacia): void
    {
        // Tu môžete pridať logiku, ktorá sa má vykonať po vymazaní záznamu
    }

    /**
     * Metóda sa spustí pred obnovením vymazanej informácie
     *
     * @param Informacia $informacia
     * @return void
     */
    public function restoring(Informacia $informacia): void
    {
        // Tu môžete pridať logiku, ktorá sa má vykonať pred obnovením vymazaného záznamu
    }

    /**
     * Metóda sa spustí po obnovení vymazanej informácie
     *
     * @param Informacia $informacia
     * @return void
     */
    public function restored(Informacia $informacia): void
    {
        // Tu môžete pridať logiku, ktorá sa má vykonať po obnovení vymazaného záznamu
    }

    /**
     * Metóda sa spustí po trvalom vymazaní informácie
     *
     * @param Informacia $informacia
     * @return void
     */
    public function forceDeleted(Informacia $informacia): void
    {
        // Tu môžete pridať logiku, ktorá sa má vykonať po trvalom vymazaní záznamu
    }
}