<?php
declare(strict_types=1);
session_start();

const ADMIN_PASSWORD_HASH = '$2y$12$ZLeegXsydVpakDFiJIESHOXJjdA6ZDIOWicAL4DJIlKfhpQfppQrW';

$reviewsFile = __DIR__ . '/reviews.json';
$galleryFile = __DIR__ . '/gallery.json';
$galleryDir = __DIR__ . '/assets/images/gallery';
if (!is_dir($galleryDir)) @mkdir($galleryDir, 0755, true);
if (!is_file($reviewsFile)) @file_put_contents($reviewsFile, "[]", LOCK_EX);
if (!is_file($galleryFile)) @file_put_contents($galleryFile, "[]", LOCK_EX);

function read_json_file(string $file): array {
    $fp = @fopen($file, 'c+');
    if (!$fp) return [];
    if (!flock($fp, LOCK_SH)) { fclose($fp); return []; }
    $contents = stream_get_contents($fp);
    flock($fp, LOCK_UN); fclose($fp);
    $data = json_decode($contents ?: '[]', true);
    return is_array($data) ? $data : [];
}
function write_json_file(string $file, array $items): bool {
    $fp = @fopen($file, 'c+');
    if (!$fp || !flock($fp, LOCK_EX)) { if ($fp) fclose($fp); return false; }
    ftruncate($fp, 0); rewind($fp);
    $ok = fwrite($fp, json_encode($items, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT)) !== false;
    fflush($fp); flock($fp, LOCK_UN); fclose($fp); return $ok;
}
function e(string $v): string { return htmlspecialchars($v, ENT_QUOTES, 'UTF-8'); }

if (isset($_GET['logout'])) {
    $_SESSION = []; session_destroy(); header('Location: admin.php'); exit;
}

$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['login'])) {
    if (password_verify((string)($_POST['password'] ?? ''), ADMIN_PASSWORD_HASH)) {
        $_SESSION['atomy_admin'] = true; session_regenerate_id(true); header('Location: admin.php'); exit;
    }
    $error = 'Неверный пароль.';
}

if (empty($_SESSION['atomy_admin'])):
?>
<!doctype html><html lang="ru"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Atomy — вход в админку</title>
<style>*{box-sizing:border-box}body{margin:0;min-height:100vh;background:#f4fafc;color:#11343d;font-family:Arial,sans-serif;display:grid;place-items:center;padding:20px}.box{width:min(430px,100%);background:#fff;border:1px solid #dbecef;border-radius:24px;padding:32px;box-shadow:0 18px 60px #0b607a18}h1{margin:0 0 8px;font-size:28px}p{color:#67818a;line-height:1.5}.logo{font-weight:800;color:#08aeda;letter-spacing:2px;margin-bottom:22px}label{display:block;font-weight:700;margin:22px 0 8px}input{width:100%;padding:15px;border:1px solid #cfe1e6;border-radius:12px;font-size:16px}button{width:100%;margin-top:16px;padding:15px;border:0;border-radius:12px;background:#08aeda;color:#fff;font-weight:700;font-size:16px;cursor:pointer}.err{background:#fff0f0;color:#b33b3b;padding:12px;border-radius:10px;margin-top:14px}</style></head><body><div class="box"><div class="logo">ATOMY</div><h1>Админ-панель Светланы</h1><p>Управление отзывами и фотографиями сайта.</p><form method="post"><input type="hidden" name="login" value="1"><label>Пароль администратора</label><input type="password" name="password" autocomplete="current-password" required autofocus><button>Войти</button></form><?php if($error): ?><div class="err"><?=e($error)?></div><?php endif; ?></div></body></html>
<?php exit; endif;

$message = '';
$error = '';

// Удаление отзыва.
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_review'])) {
    $id = (int)$_POST['delete_review'];
    $reviews = read_json_file($reviewsFile);
    $reviews = array_values(array_filter($reviews, fn($r) => (int)($r['id'] ?? 0) !== $id));
    write_json_file($reviewsFile, $reviews);
    header('Location: admin.php#reviews-admin'); exit;
}

// Добавление фотографии.
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['upload_gallery'])) {
    $title = trim((string)($_POST['title'] ?? ''));
    $caption = trim((string)($_POST['caption'] ?? ''));
    $category = trim((string)($_POST['category'] ?? 'Команда'));
    $file = $_FILES['photo'] ?? null;
    $allowed = ['jpg'=>'image/jpeg','jpeg'=>'image/jpeg','png'=>'image/png','webp'=>'image/webp'];
    $maxSize = 8 * 1024 * 1024;
    if (!$file || ($file['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK) $error = 'Выберите фотографию.';
    elseif (($file['size'] ?? 0) > $maxSize) $error = 'Фото слишком большое. Максимум — 8 МБ.';
    else {
        $ext = strtolower(pathinfo((string)$file['name'], PATHINFO_EXTENSION));
        $info = @getimagesize((string)$file['tmp_name']);
        if (!isset($allowed[$ext]) || !$info || !in_array($info['mime'] ?? '', array_values($allowed), true)) $error = 'Разрешены только JPG, PNG и WEBP.';
        elseif ($title === '') $error = 'Укажите название фотографии.';
        else {
            $safe = preg_replace('/[^a-zA-Z0-9_-]+/', '-', $title) ?: 'atomy-photo';
            $filename = date('YmdHis') . '_' . bin2hex(random_bytes(4)) . '_' . trim($safe, '-') . '.' . $ext;
            $target = $galleryDir . '/' . $filename;
            if (!move_uploaded_file((string)$file['tmp_name'], $target)) $error = 'Не удалось сохранить фото. Проверьте права на папку gallery.';
            else {
                $items = read_json_file($galleryFile);
                $id = 1; foreach ($items as $item) $id = max($id, ((int)($item['id'] ?? 0)) + 1);
                $items[] = ['id'=>$id,'file'=>$filename,'title'=>mb_substr($title,0,100),'caption'=>mb_substr($caption,0,300),'category'=>mb_substr($category ?: 'Команда',0,50),'created_at'=>date('d.m.Y')];
                write_json_file($galleryFile, $items);
                header('Location: admin.php#gallery-admin'); exit;
            }
        }
    }
}

// Удаление фотографии.
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_gallery'])) {
    $id = (int)$_POST['delete_gallery'];
    $items = read_json_file($galleryFile);
    $keep = [];
    foreach ($items as $item) {
        if ((int)($item['id'] ?? 0) === $id) {
            $name = basename((string)($item['file'] ?? ''));
            $path = $galleryDir . '/' . $name;
            if (is_file($path)) @unlink($path);
        } else $keep[] = $item;
    }
    write_json_file($galleryFile, array_values($keep));
    header('Location: admin.php#gallery-admin'); exit;
}

$reviews = array_reverse(read_json_file($reviewsFile));
$gallery = array_reverse(read_json_file($galleryFile));
?>
<!doctype html><html lang="ru"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Atomy — админ-панель Светланы</title>
<style>
*{box-sizing:border-box}body{margin:0;background:#f5fafc;color:#11343d;font-family:Arial,sans-serif}.top{background:#fff;border-bottom:1px solid #dcecef;padding:18px 24px;display:flex;justify-content:space-between;align-items:center;gap:15px;position:sticky;top:0;z-index:3}.brand{font-weight:800;letter-spacing:2px;color:#08aeda;font-size:22px}.top a{color:#55727b;text-decoration:none}.wrap{width:min(1100px,calc(100% - 28px));margin:28px auto}.head{display:flex;justify-content:space-between;align-items:end;gap:20px;margin-bottom:22px}.head h1{margin:0;font-size:34px}.muted{color:#718990}.tabs{display:flex;gap:10px;flex-wrap:wrap;margin:0 0 25px}.tabs a{padding:11px 15px;border-radius:12px;background:#fff;border:1px solid #dcecef;color:#176173;text-decoration:none;font-weight:700}.panel{background:#fff;border:1px solid #dcecef;border-radius:22px;padding:22px;margin-bottom:28px;box-shadow:0 8px 30px #0b607a0b}.panel h2{margin:0 0 7px;font-size:25px}.panel>p{color:#718990;margin-top:0}.upload{display:grid;grid-template-columns:1fr 1fr;gap:14px}.field{display:flex;flex-direction:column;gap:7px}.field.full{grid-column:1/-1}.field label{font-weight:700;font-size:13px}.field input,.field textarea,.field select{width:100%;padding:13px;border:1px solid #cfe1e6;border-radius:12px;font-size:15px;font-family:inherit}.field textarea{min-height:90px;resize:vertical}.primary{border:0;background:#08aeda;color:#fff;border-radius:12px;padding:13px 18px;font-weight:800;cursor:pointer}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.photo-card{border:1px solid #dcecef;border-radius:18px;overflow:hidden;background:#fff}.photo-card img{display:block;width:100%;height:220px;object-fit:cover}.photo-body{padding:15px}.cat{font-size:9px;text-transform:uppercase;letter-spacing:1.4px;color:#08aeda;font-weight:800}.photo-body h3{margin:7px 0 5px;font-size:16px}.photo-body p{margin:0 0 12px;color:#718990;font-size:13px;line-height:1.5}.photo-meta{font-size:11px;color:#94a6ab;margin-bottom:12px}.danger{border:0;background:#fff0f0;color:#b33b3b;border-radius:10px;padding:9px 12px;font-weight:700;cursor:pointer}.review-grid{display:grid;gap:16px}.review-card{border:1px solid #dcecef;border-radius:18px;padding:18px}.meta{display:flex;justify-content:space-between;gap:15px}.product{font-weight:800;color:#08aeda}.stars{letter-spacing:2px}.date{color:#84999f;font-size:13px;margin-top:5px}.review-text{font-size:15px;line-height:1.6;margin:13px 0;white-space:pre-wrap}.author{font-weight:700}.empty{padding:40px;text-align:center;background:#f8fcfd;border-radius:16px;color:#718990}.note{background:#fff9e8;border:1px solid #f0df9f;color:#6e5c20;border-radius:14px;padding:13px 15px;font-size:13px;margin-top:14px}.error{background:#fff0f0;color:#b33b3b;padding:12px;border-radius:10px;margin-bottom:18px}.back{color:#08a0cf;text-decoration:none}.footer{padding:15px 0 50px;color:#84999f;font-size:12px}@media(max-width:800px){.grid{grid-template-columns:repeat(2,1fr)}.upload{grid-template-columns:1fr}.field.full{grid-column:auto}}@media(max-width:560px){.wrap{width:calc(100% - 20px)}.top{padding:15px}.head{display:block}.head h1{font-size:28px;margin-bottom:8px}.grid{grid-template-columns:1fr}.photo-card img{height:auto;aspect-ratio:4/3}.meta{display:block}.danger{margin-top:10px}}
</style></head><body>
<header class="top"><div class="brand">ATOMY</div><a href="index.html">Сайт</a><a href="?logout=1">Выйти</a></header>
<main class="wrap">
  <div class="head"><div><h1>Админ-панель Светланы</h1><div class="muted">Фотографии, команда, встречи и отзывы</div></div></div>
  <nav class="tabs"><a href="#gallery-admin">📸 Галерея</a><a href="#reviews-admin">⭐ Отзывы</a></nav>
  <?php if($error): ?><div class="error"><?=e($error)?></div><?php endif; ?>

  <section class="panel" id="gallery-admin">
    <h2>📸 Галерея Atomy</h2>
    <p>Добавляй сюда фотографии с командой, встреч, мероприятий, обучения и продукции. Они автоматически появятся в разделе «Галерея Atomy» на сайте.</p>
    <form class="upload" method="post" enctype="multipart/form-data">
      <input type="hidden" name="upload_gallery" value="1">
      <div class="field"><label>Название фотографии *</label><input name="title" maxlength="100" placeholder="Например: Встреча команды в Караганде" required></div>
      <div class="field"><label>Категория</label><select name="category"><option>Команда</option><option>Встречи</option><option>Мероприятия</option><option>Продукция</option><option>Обучение</option><option>Atomy</option></select></div>
      <div class="field full"><label>Короткое описание</label><textarea name="caption" maxlength="300" placeholder="Например: Наша команда на встрече Atomy"></textarea></div>
      <div class="field"><label>Фотография *</label><input type="file" name="photo" accept="image/jpeg,image/png,image/webp" required></div>
      <div class="field" style="justify-content:end"><button class="primary" type="submit">➕ Добавить фотографию</button></div>
    </form>
    <div class="note">JPG, PNG или WEBP, максимум 8 МБ. Перед публикацией убедись, что у тебя есть право размещать фотографию и изображённые на ней люди согласны на публикацию.</div>
  </section>

  <section class="panel">
    <h2>Фотографии на сайте</h2>
    <p>Всего: <?=count($gallery)?></p>
    <?php if(!$gallery): ?><div class="empty">Фотографий пока нет.</div><?php else: ?><div class="grid">
      <?php foreach($gallery as $item): ?><article class="photo-card">
        <img src="assets/images/gallery/<?=e(basename((string)($item['file']??'')))?>" alt="<?=e((string)($item['title']??'Atomy'))?>" loading="lazy">
        <div class="photo-body"><div class="cat"><?=e((string)($item['category']??'Atomy'))?></div><h3><?=e((string)($item['title']??''))?></h3><p><?=e((string)($item['caption']??''))?></p><div class="photo-meta"><?=e((string)($item['created_at']??''))?></div><form method="post" onsubmit="return confirm('Удалить эту фотографию с сайта?');"><input type="hidden" name="delete_gallery" value="<?= (int)($item['id']??0) ?>"><button class="danger">Удалить</button></form></div>
      </article><?php endforeach; ?></div><?php endif; ?>
  </section>

  <section class="panel" id="reviews-admin">
    <h2>⭐ Отзывы посетителей</h2>
    <p>Здесь можно удалить любой отзыв, который выглядит как спам или не подходит для сайта.</p>
    <div class="review-grid">
      <?php if(!$reviews): ?><div class="empty">Отзывов пока нет.</div><?php endif; ?>
      <?php foreach($reviews as $r): ?><article class="review-card"><div class="meta"><div><div class="product"><?=e((string)($r['product']??'Atomy'))?></div><div class="date"><?=e((string)($r['created_at']??''))?></div></div><div class="stars"><?=str_repeat('★',max(1,min(5,(int)($r['rating']??5))))?></div></div><div class="review-text"><?=e((string)($r['text']??''))?></div><div class="meta"><div class="author"><?=e((string)($r['name']??''))?></div><form method="post" onsubmit="return confirm('Удалить этот отзыв?');"><input type="hidden" name="delete_review" value="<?= (int)($r['id']??0) ?>"><button class="danger">Удалить</button></form></div></article><?php endforeach; ?>
    </div>
  </section>
  <div class="footer">Админ-панель доступна только после входа по паролю. <a class="back" href="index.html">Вернуться на сайт →</a></div>
</main></body></html>
