<?php
/**
 * VersionCheckEventHandler.php
 * Copyright (c) 2017 thegrumpydictator@gmail.com
 *
 * This file is part of Firefly III.
 *
 * Firefly III is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Firefly III is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
 */

declare(strict_types=1);

namespace FireflyIII\Handlers\Events;

use FireflyConfig;
use FireflyIII\Events\RequestedVersionCheckStatus;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Services\Github\Object\Release;
use FireflyIII\Services\Github\Request\UpdateRequest;
use FireflyIII\User;
use Log;

/**
 * Class VersionCheckEventHandler
 */
class VersionCheckEventHandler
{

    /**
     * @param RequestedVersionCheckStatus $event
     */
    public function checkForUpdates(RequestedVersionCheckStatus $event)
    {
        // in Sandstorm, cannot check for updates:
        $sandstorm = 1 === intval(getenv('SANDSTORM'));
        if ($sandstorm === true) {
            return;
        }


        /** @var User $user */
        $user = $event->user;
        if (!$user->hasRole('owner')) {
            return;
        }

        $permission    = FireflyConfig::get('permission_update_check', -1);
        $lastCheckTime = FireflyConfig::get('last_update_check', time());
        $now           = time();
        if ($now - $lastCheckTime->data < 604800) {
            Log::debug(sprintf('Checked for updates less than a week ago (on %s).', date('Y-m-d H:i:s',$lastCheckTime->data)));

            return;

        }
        // last check time was more than a week ago.
        Log::debug('Have not checked for a new version in a week!');

        // have actual permission?
        if ($permission->data === -1) {
            // never asked before.
            session()->flash('info', strval(trans('firefly.check_for_updates_permission', ['link' => route('admin.update-check')])));

            return;
        }

        $current = config('firefly.version');
        /** @var UpdateRequest $request */
        $request = app(UpdateRequest::class);
        $check   = -2;
        $first   = new Release(['id' => '0', 'title' => '0', 'updated' => '2017-01-01', 'content' => '']);
        try {
            $request->call();
            $releases = $request->getReleases();
            // first entry should be the latest entry:
            /** @var Release $first */
            $first = reset($releases);
            $check = version_compare($current, $first->getTitle());
            FireflyConfig::set('last_update_check', time());
        } catch (FireflyException $e) {
            Log::error(sprintf('Could not check for updates: %s', $e->getMessage()));
        }
        if ($check === -2) {
            $string = strval(trans('firefly.update_check_error'));
        }
        if ($check === -1) {
            // there is a new FF version!
            $monthAndDayFormat = (string)trans('config.month_and_day');
            $string            = strval(
                trans(
                    'firefly.update_new_version_alert',
                    ['your_version' => $current, 'new_version' => $first->getTitle(), 'date' => $first->getUpdated()->formatLocalized($monthAndDayFormat)]
                )
            );
            session()->flash('info', $string);
        }

        return;
    }

}