<?php

declare(strict_types=1);

/**
 * @copyright  2020 Podlibre
 * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
 * @link       https://castopod.org/
 */

namespace Modules\Admin\Controllers;

use CodeIgniter\HTTP\RedirectResponse;
use PHP_ICO;

class SettingsController extends BaseController
{
    public function index(): string
    {
        helper('form');
        return view('settings/general');
    }

    public function attemptInstanceEdit(): RedirectResponse
    {
        $rules = [
            'site_icon' =>
                'is_image[site_icon]|ext_in[site_icon,png,jpeg]|is_image_squared[site_icon]|min_dims[image,512,512]|permit_empty',
        ];

        if (! $this->validate($rules)) {
            return redirect()
                ->back()
                ->withInput()
                ->with('errors', $this->validator->getErrors());
        }

        $siteName = $this->request->getPost('site_name');
        if ($siteName !== service('settings')->get('App.siteName')) {
            service('settings')->set('App.siteName', $siteName);
        }

        $siteDescription = $this->request->getPost('site_description');
        if ($siteDescription !== service('settings')->get('App.siteDescription')) {
            service('settings')->set('App.siteDescription', $siteDescription);
        }

        $siteIconFile = $this->request->getFile('site_icon');
        if ($siteIconFile !== null && $siteIconFile->isValid()) {
            helper(['filesystem', 'media']);

            // delete site folder in media before repopulating it
            delete_files(ROOTPATH . 'public/media/site/');

            // save original in disk
            $originalFilename = save_media($siteIconFile, 'site', 'icon');

            // convert jpeg image to png if not
            if ($siteIconFile->getClientMimeType() !== 'image/png') {
                service('image')->withFile(ROOTPATH . 'public/media/' . $originalFilename)
                    ->convert(IMAGETYPE_JPEG)
                    ->save(ROOTPATH . 'public/media/site/icon.png');
            }

            // generate random hash to use as a suffix to renew browser cache
            $randomHash = substr(bin2hex(random_bytes(18)), 0, 8);

            // generate ico
            $ico_lib = new PHP_ICO();
            $ico_lib->add_image(ROOTPATH . 'public/media/site/icon.png', [[32, 32], [64, 64]]);
            $ico_lib->save_ico(ROOTPATH . "public/media/site/favicon.{$randomHash}.ico");

            // resize original to needed sizes
            foreach ([64, 180, 192, 512] as $size) {
                service('image')
                    ->withFile(ROOTPATH . 'public/media/site/icon.png')
                    ->resize($size, $size)
                    ->save(ROOTPATH . "public/media/site/icon-{$size}.{$randomHash}.png");
            }

            service('settings')
                ->set('App.siteIcon', [
                    'ico' => "/media/site/favicon.{$randomHash}.ico",
                    '64' => "/media/site/icon-64.{$randomHash}.png",
                    '180' => "/media/site/icon-180.{$randomHash}.png",
                    '192' => "/media/site/icon-192.{$randomHash}.png",
                    '512' => "/media/site/icon-512.{$randomHash}.png",
                ]);
        }

        return redirect()->back();
    }

    public function deleteIcon(): RedirectResponse
    {
        helper('filesystem');
        // delete site folder in media
        delete_files(ROOTPATH . 'public/media/site/');

        service('settings')
            ->forget('App.siteIcon');

        return redirect()->back();
    }
}