<?php

namespace App\Console\Commands;

use App\Models\Informacia\Enums\StavInformacieEnum;
use App\Models\Informacia\Informacia;
use Carbon\Carbon;
use Exception;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

/**
 * Class PublishScheduledInformacieCommand
 *
 * Zverejnuje informacie, ktore maju naplanovany cas zverejnenia
 *
 * @package App\Console\Commands
 * @author Radoslav Lukac <dev@seka.sk>
 */
class PublishScheduledInformacieCommand extends Command
{
    /**
     * Nazov prikazu na spustenie v terminali
     *
     * @var string
     */
    protected $signature = 'informacie:publish-scheduled';

    /**
     * Popis prikazu
     *
     * @var string
     */
    protected $description = 'Zverejní informácie, ktoré majú naplánovaný čas zverejnenia';

    /**
     * Spracuje command na zverejnenie informacii
     *
     * @return void
     */
    public function handle(): void
    {
        $now = Carbon::now();

        // Získame všetky informácie, ktoré majú byť zverejnené
        $informacie = Informacia::query()
            ->where('stav', '=', StavInformacieEnum::PLANOVANE_ZVEREJNENIE())
            ->whereNotNull('planovany_cas_zverejnenia')
            ->where('planovany_cas_zverejnenia', '<=', $now)
            ->whereNull('cas_zverejnenia')
            ->get();

        foreach ($informacie as $informacia) {
            try {
                // Aktualizujeme stav informácie na zverejnenú
                $informacia->stav = StavInformacieEnum::ZVEREJNENA();
                $informacia->cas_zverejnenia = $now;
                $informacia->save();

                $this->info(sprintf('Informácia ID:%s bola úspešne zverejnená.', $informacia->id));
            } catch (Exception $e) {
                $this->error(
                    sprintf('Chyba pri zverejňovaní informácie ID:%s; message:%s', $informacia->id, $e->getMessage()),
                );
                Log::error('Chyba pri zverejňovaní informácie', [
                    'informacia_id' => $informacia->id,
                    'error' => $e->getMessage(),
                ]);
            }
        }
    }
}
