<?php
/* =====================================================================
   API پنل مدیریت سایت ترم تابستان
   وظیفه: نوشتن مستقیم محتوای پنل روی فایل‌های سایت
   تا دیگر نیازی به دانلود/آپلود دستی نباشد.
   کارها: ping | load | login | save | changepw | backups | restore
   ===================================================================== */

header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('X-Content-Type-Options: nosniff');

$ROOT       = dirname(__DIR__);                 // ریشه سایت
$CONTENT    = $ROOT . '/assets/js/content.js';  // فایل محتوا
$VERSION    = $ROOT . '/version.json';          // نسخه برای دور زدن کش
$PWFILE     = __DIR__ . '/.admin-pass';         // هش رمز (پس از تغییر رمز ساخته می‌شود)
$BACKUPDIR  = __DIR__ . '/backups';             // نسخه‌های پشتیبان
$DEFAULT_PW = 'shahed1405';                     // رمز پیش‌فرض — حتماً از پنل تغییرش دهید
$KEEP       = 15;                               // تعداد نسخه پشتیبان نگه‌داشتنی

function out($arr, $code = 200) {
    http_response_code($code);
    echo json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    exit;
}

function pw_ok($pw, $PWFILE, $DEFAULT_PW) {
    $pw = (string) $pw;
    if (is_file($PWFILE)) {
        $h = trim((string) file_get_contents($PWFILE));
        if ($h !== '') {
            return function_exists('password_verify') ? password_verify($pw, $h) : hash_equals($h, crypt($pw, $h));
        }
    }
    return hash_equals($DEFAULT_PW, $pw);
}

function atomic_write($path, $text) {
    $tmp = $path . '.tmp' . getmypid();
    if (@file_put_contents($tmp, $text) === false) return false;
    @chmod($tmp, 0644);
    if (!@rename($tmp, $path)) { @unlink($tmp); return @file_put_contents($path, $text) !== false; }
    return true;
}

/* ---------- ورودی ---------- */
$raw = file_get_contents('php://input');
$in  = json_decode((string) $raw, true);
if (!is_array($in)) $in = $_POST;
$action = isset($in['action']) ? $in['action'] : (isset($_GET['action']) ? $_GET['action'] : 'ping');
$pw     = isset($in['password']) ? $in['password'] : '';

/* ---------- ping ---------- */
if ($action === 'ping') {
    $writable = is_writable($CONTENT) && (is_writable($VERSION) || is_writable($ROOT));
    out(array(
        'ok' => true, 'api' => '1.0', 'writable' => $writable,
        'hasCustomPassword' => is_file($PWFILE),
        'php' => PHP_VERSION,
    ));
}

/* ---------- load: خواندن محتوای فعلی سایت ---------- */
if ($action === 'load') {
    if (!is_file($CONTENT)) out(array('ok' => false, 'error' => 'فایل content.js پیدا نشد'), 404);
    $txt = (string) file_get_contents($CONTENT);
    $s = strpos($txt, '{'); $e = strrpos($txt, '}');
    if ($s === false || $e === false || $e <= $s) out(array('ok' => false, 'error' => 'content.js نامعتبر است'), 500);
    $data = json_decode(substr($txt, $s, $e - $s + 1), true);
    if (!is_array($data)) out(array('ok' => false, 'error' => 'خواندن محتوا ناموفق بود'), 500);
    out(array('ok' => true, 'data' => $data, 'build' => isset($data['contentVersion']) ? $data['contentVersion'] : ''));
}

/* ---------- login ---------- */
if ($action === 'login') {
    if (!pw_ok($pw, $PWFILE, $DEFAULT_PW)) out(array('ok' => false, 'error' => 'رمز اشتباه است'), 401);
    out(array('ok' => true));
}

/* از اینجا به بعد همه نیاز به رمز دارند */
if (!pw_ok($pw, $PWFILE, $DEFAULT_PW)) out(array('ok' => false, 'error' => 'رمز اشتباه است یا نشست منقضی شده'), 401);

/* ---------- save: نوشتن محتوا روی سایت ---------- */
if ($action === 'save') {
    $data = isset($in['data']) ? $in['data'] : null;
    if (!is_array($data) || !isset($data['site'])) out(array('ok' => false, 'error' => 'داده‌ی ارسالی نامعتبر است'), 400);
    if (!is_writable($CONTENT)) out(array('ok' => false, 'error' => 'فایل assets/js/content.js قابل نوشتن نیست (دسترسی 644 و مالکیت را بررسی کنید)'), 500);

    /* پشتیبان از نسخه‌ی قبلی */
    if (!is_dir($BACKUPDIR)) @mkdir($BACKUPDIR, 0755, true);
    if (is_dir($BACKUPDIR) && is_file($CONTENT)) {
        @copy($CONTENT, $BACKUPDIR . '/content-' . date('Ymd-His') . '.js');
        $olds = glob($BACKUPDIR . '/content-*.js');
        if (is_array($olds) && count($olds) > $KEEP) {
            sort($olds);
            foreach (array_slice($olds, 0, count($olds) - $KEEP) as $f) @unlink($f);
        }
    }

    $stamp = date('Y-m-d.Hi') . '-' . substr((string) time(), -3);
    $data['contentVersion'] = $stamp;
    $flags = JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES;
    if (defined('JSON_PRETTY_PRINT')) $flags |= JSON_PRETTY_PRINT;
    $json = json_encode($data, $flags);
    if ($json === false) out(array('ok' => false, 'error' => 'تبدیل محتوا به JSON ناموفق بود'), 500);

    $txt = "/* محتوای منتشرشده‌ی سایت ترم تابستان — این فایل توسط پنل مدیریت به‌طور خودکار نوشته می‌شود */\n"
         . 'window.SITE_DATA = ' . $json . ";\n";

    if (!atomic_write($CONTENT, $txt)) out(array('ok' => false, 'error' => 'نوشتن content.js ناموفق بود'), 500);
    atomic_write($VERSION, json_encode(array('build' => $stamp)) . "\n");

    out(array('ok' => true, 'build' => $stamp, 'bytes' => strlen($txt)));
}

/* ---------- changepw ---------- */
if ($action === 'changepw') {
    $new = isset($in['newPassword']) ? trim((string) $in['newPassword']) : '';
    if (strlen($new) < 6) out(array('ok' => false, 'error' => 'رمز جدید حداقل ۶ کاراکتر باشد'), 400);
    $hash = function_exists('password_hash') ? password_hash($new, PASSWORD_DEFAULT) : crypt($new, '$2y$10$' . substr(md5(uniqid('', true)), 0, 22));
    if (!atomic_write($PWFILE, $hash . "\n")) out(array('ok' => false, 'error' => 'ذخیره رمز جدید ناموفق بود (دسترسی پوشه api)'), 500);
    @chmod($PWFILE, 0600);
    out(array('ok' => true));
}

/* ---------- backups: فهرست نسخه‌های پشتیبان ---------- */
if ($action === 'backups') {
    $list = array();
    foreach ((array) glob($BACKUPDIR . '/content-*.js') as $f) {
        $list[] = array('name' => basename($f), 'size' => filesize($f), 'time' => date('Y-m-d H:i:s', filemtime($f)));
    }
    usort($list, function ($a, $b) { return strcmp($b['name'], $a['name']); });
    out(array('ok' => true, 'items' => $list));
}

/* ---------- restore: بازگرداندن یک نسخه پشتیبان ---------- */
if ($action === 'restore') {
    $name = isset($in['name']) ? basename((string) $in['name']) : '';
    $src  = $BACKUPDIR . '/' . $name;
    if ($name === '' || !is_file($src)) out(array('ok' => false, 'error' => 'نسخه پشتیبان پیدا نشد'), 404);
    if (!atomic_write($CONTENT, (string) file_get_contents($src))) out(array('ok' => false, 'error' => 'بازگرداندن ناموفق بود'), 500);
    $stamp = date('Y-m-d.Hi') . '-r';
    atomic_write($VERSION, json_encode(array('build' => $stamp)) . "\n");
    out(array('ok' => true, 'build' => $stamp));
}

out(array('ok' => false, 'error' => 'درخواست نامعتبر'), 400);
