<?php
namespace Misuzu;

use Misuzu\Config\DbConfig;

if(!$msz->getAuthInfo()->getPerms('global')->check(Perm::G_CONFIG_MANAGE))
    Template::throwError(403);

$isNew = true;
$sName = (string)filter_input(INPUT_GET, 'name');
$sType = (string)filter_input(INPUT_GET, 'type');
$sValue = null;
$loadValueInfo = fn() => $cfg->getValueInfo($sName);

if(!empty($sName)) {
    $sInfo = $loadValueInfo();
    if($sInfo !== null) {
        $isNew = false;
        $sName = $sInfo->getName();
        $sType = $sInfo->getType();
        $sValue = $sInfo->getValue();
    }
}

while($_SERVER['REQUEST_METHOD'] === 'POST' && CSRF::validateRequest()) {
    if($isNew) {
        $sName = trim((string)filter_input(INPUT_POST, 'conf_name'));
        if(!DbConfig::validateName($sName)) {
            echo 'Name contains invalid characters.';
            break;
        }

        $sType = trim((string)filter_input(INPUT_POST, 'conf_type'));
        if(!in_array($sType, ['string', 'int', 'float', 'bool', 'array'])) {
            echo 'Invalid type specified.';
            break;
        }
    }

    if($sType === 'array') {
        $applyFunc = $cfg->setArray(...);
        $sValue = [];
        $sRaw = filter_input(INPUT_POST, 'conf_value', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
        foreach($sRaw as $rValue) {
            if(strpos($rValue, ':') === 1) {
                $rType = $rValue[0];
                $rValue = substr($rValue, 2);
                $sValue[] = match($rType) {
                    's' => $rValue,
                    'i' => (int)$rValue,
                    'd' => (float)$rValue,
                    'f' => (float)$rValue,
                    'b' => $rValue !== 'false' && $rValue !== '0' && $rValue !== '',
                    default => '',
                };
            } else
                $sValue[] = $rValue;
        }
    } elseif($sType === 'bool') {
        $sValue = !empty($_POST['conf_value']);
        $applyFunc = $cfg->setBoolean(...);
    } else {
        $sValue = filter_input(INPUT_POST, 'conf_value');
        if($sType === 'int') {
            $applyFunc = $cfg->setInteger(...);
            $sValue = (int)$sValue;
        } elseif($sType === 'float') {
            $applyFunc = $cfg->setFloat(...);
            $sValue = (float)$sValue;
        } else
            $applyFunc = $cfg->setString(...);
    }

    $msz->createAuditLog($isNew ? 'CONFIG_CREATE' : 'CONFIG_UPDATE', [$sName]);
    $applyFunc($sName, $sValue);
    Tools::redirect($msz->getURLs()->format('manage-general-settings'));
    return;
}

if($sType === 'array' && !empty($sValue))
    foreach($sValue as $key => $value)
        $sValue[$key] = gettype($value)[0] . ':' . $value;

Template::render('manage.general.setting', [
    'config_new' => $isNew,
    'config_name' => $sName,
    'config_type' => $sType,
    'config_value' => $sValue,
]);
