<?php
// ---------------------------------------------------------------------------
// 后台设置 / Admin settings
//
// 没有预置密码。第一次打开 /admin/ 时自己设一个，hash 写进 data/auth.json。
// 忘了密码就把 data/auth.json 删掉，下次访问会重新让你设。
// ---------------------------------------------------------------------------

const LINKS_FILE = __DIR__ . '/../data/links.json';
const AUTH_FILE  = __DIR__ . '/../data/auth.json';

// 登录失败锁定：同一 session 连续错这么多次后，锁定 LOCKOUT_SECONDS 秒
const MAX_ATTEMPTS = 5;
const LOCKOUT_SECONDS = 300;
const MIN_PASSWORD_LEN = 8;

function data_dir(): string
{
    return dirname(LINKS_FILE);
}

/**
 * 原子写入，避免前台正好读到写了一半的文件。
 */
function write_json(string $file, array $payload): bool
{
    $dir = dirname($file);
    if (!is_dir($dir) && !mkdir($dir, 0755, true) && !is_dir($dir)) {
        return false;
    }
    $tmp = $file . '.tmp';
    $json = json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
    if (file_put_contents($tmp, $json, LOCK_EX) === false) {
        return false;
    }
    return rename($tmp, $file);
}

/* ------------------------------------------------------------------ 密码 */

function password_is_set(): bool
{
    return is_file(AUTH_FILE) && !empty(load_auth()['hash']);
}

function load_auth(): array
{
    if (!is_file(AUTH_FILE)) {
        return [];
    }
    $data = json_decode((string) file_get_contents(AUTH_FILE), true);
    return is_array($data) ? $data : [];
}

function set_password(string $plain): bool
{
    return write_json(AUTH_FILE, [
        'hash' => password_hash($plain, PASSWORD_DEFAULT),
        'set_at' => date('c'),
    ]);
}

function check_password(string $plain): bool
{
    $hash = load_auth()['hash'] ?? '';
    return $hash !== '' && password_verify($plain, $hash);
}

/* -------------------------------------------------------------- 链接存储 */

/**
 * 文件不存在或损坏时回落到默认值，前台永远不会拿到空 link。
 */
function load_link(): array
{
    $default = ['link' => 'https://example.com/', 'updated' => null];
    if (!is_file(LINKS_FILE)) {
        return $default;
    }
    $data = json_decode((string) file_get_contents(LINKS_FILE), true);
    if (!is_array($data) || empty($data['link'])) {
        return $default;
    }
    return $data + $default;
}

function save_link(string $url): bool
{
    return write_json(LINKS_FILE, ['link' => $url, 'updated' => date('c')]);
}
