<?php
// ============================================================
//  Generic app settings — key/value store
// ============================================================
//
//  setting_get('payfast.fee_percent')        → value (typed)
//  setting_get('foo', 'default')             → 'default' if missing
//  setting_set('foo', 'bar', 'string')       → upserts
//  setting_all_in_category('gateway_fees')   → array of full rows for admin UI
//
// ============================================================

require_once __DIR__ . '/db.php';

function setting_get(string $key, $default = null) {
    static $cache = [];
    if (array_key_exists($key, $cache)) return $cache[$key];

    try {
        $row = db_row('SELECT `value`,`type` FROM app_settings WHERE `key`=:k', ['k' => $key]);
    } catch (Throwable $e) {
        return $default;
    }
    if (!$row) {
        $cache[$key] = $default;
        return $default;
    }

    $v = $row['value'];
    switch ($row['type']) {
        case 'int':   $v = (int)$v; break;
        case 'float': $v = (float)$v; break;
        case 'bool':  $v = ($v === '1' || strtolower((string)$v) === 'true'); break;
        case 'json':  $v = json_decode((string)$v, true); break;
        // string: leave as-is
    }
    $cache[$key] = $v;
    return $v;
}

function setting_set(string $key, $value, string $type = 'string'): void {
    if ($type === 'json' && !is_string($value)) {
        $value = json_encode($value);
    } elseif ($type === 'bool') {
        $value = $value ? '1' : '0';
    } else {
        $value = (string)$value;
    }
    db_exec(
        'INSERT INTO app_settings (`key`,`value`,`type`)
         VALUES (:k,:v,:t)
         ON DUPLICATE KEY UPDATE `value`=:v2, `type`=:t2, updated_at=NOW()',
        ['k'=>$key,'v'=>$value,'t'=>$type,'v2'=>$value,'t2'=>$type]
    );
}

function setting_all_in_category(string $category): array {
    return db_all(
        'SELECT * FROM app_settings WHERE `category`=:c ORDER BY `key`',
        ['c' => $category]
    );
}

/**
 * Calculate the gateway fee on a gross payment amount.
 * Returns ['fee_excl' => float, 'vat' => float, 'fee_incl' => float].
 */
function gateway_calc_fee(string $gateway, float $gross_amount): array {
    $g = strtolower($gateway);
    $pct   = (float)setting_get("$g.fee_percent",     0);
    $fixed = (float)setting_get("$g.fee_fixed",       0);
    $vat   = (float)setting_get("$g.fee_vat_percent", 0);

    $fee_excl = round(($gross_amount * $pct / 100) + $fixed, 2);
    $vat_amt  = round($fee_excl * $vat / 100, 2);
    $fee_incl = round($fee_excl + $vat_amt, 2);
    return [
        'fee_excl' => $fee_excl,
        'vat'      => $vat_amt,
        'fee_incl' => $fee_incl,
    ];
}