<?php
declare(strict_types=1);

/**
 * ============================================================
 *  お知らせ管理（プラグインの管理画面）
 * ------------------------------------------------------------
 *  コアの管理共通（_bootstrap.php）に相乗りして、ヘッダ・ナビ・
 *  CSRF・アップロード・フラッシュをそのまま使う。
 * ============================================================ */

require_once dirname(dirname(__DIR__)) . '/admin/_bootstrap.php';
require_login();
require_once __DIR__ . '/list.php';

/* ============================================================
 *  POST 処理
 * ============================================================ */
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    require_post_csrf();
    $action = (string)($_POST['action'] ?? '');

    if ($action === 'add_item' || $action === 'save_item') {
        $id     = (int)($_POST['id'] ?? 0);
        $title  = trim((string)($_POST['title'] ?? ''));
        $date   = trim((string)($_POST['item_date'] ?? ''));
        $body   = (string)($_POST['body'] ?? '');
        $status = ((string)($_POST['status'] ?? 'public') === 'hidden') ? 'hidden' : 'public';

        if ($title === '') {
            flash_set('タイトルを入力してください。', 'err');
            redirect('/plugins/list-news/admin.php');
        }

        // 画像：新規アップがあればその名、無ければ既存値を維持
        $current = '';
        if ($action === 'save_item') {
            $cur = listnews_find($id);
            $current = $cur ? (string)$cur['image'] : '';
        }
        $image = resolve_image_value('image', $current);

        if ($action === 'add_item') {
            $maxSort = (int)db()->query("SELECT COALESCE(MAX(sort),0) FROM list_items")->fetchColumn();
            db()->prepare(
                "INSERT INTO list_items(list_key,title,body,image,item_date,status,sort) VALUES(?,?,?,?,?,?,?)"
            )->execute([LISTNEWS_KEY, $title, $body, $image, $date, $status, $maxSort + 1]);
            flash_set('「' . $title . '」を追加しました。');
        } else {
            if (listnews_find($id)) {
                db()->prepare(
                    "UPDATE list_items SET title=?, body=?, image=?, item_date=?, status=?, updated_at=datetime('now') WHERE id=? AND list_key=?"
                )->execute([$title, $body, $image, $date, $status, $id, LISTNEWS_KEY]);
                flash_set('保存しました。');
            }
        }
        redirect('/plugins/list-news/admin.php');
    }

    if ($action === 'delete_item') {
        $id = (int)($_POST['id'] ?? 0);
        $stI = db()->prepare("SELECT image FROM list_items WHERE id=? AND list_key=?");
        $stI->execute([$id, LISTNEWS_KEY]);
        $files = cms_extract_upload_names((string)$stI->fetchColumn());
        db()->prepare("DELETE FROM list_items WHERE id=? AND list_key=?")->execute([$id, LISTNEWS_KEY]);
        cms_cleanup_files_if_unused($files);
        flash_set('削除しました。');
        redirect('/plugins/list-news/admin.php');
    }
}

/* ============================================================
 *  入力フォーム（追加・編集 共用）
 * ============================================================ */
function listnews_fields_html(array $it): string {
    $it += ['id' => 0, 'title' => '', 'item_date' => '', 'body' => '', 'image' => '', 'status' => 'public'];
    $h = '';
    $h .= '<div class="fld"><label class="fld-label">タイトル</label>'
        . '<input type="text" name="title" value="' . h((string)$it['title']) . '" placeholder="例：営業時間のお知らせ"></div>';
    $h .= '<div class="fld"><label class="fld-label">日付</label>'
        . '<input type="date" name="item_date" value="' . h((string)$it['item_date']) . '"></div>';
    $h .= '<div class="fld"><label class="fld-label">本文</label>'
        . '<textarea name="body" rows="6" placeholder="本文を入力してください。改行はそのまま反映されます。">' . h((string)$it['body']) . '</textarea></div>';

    // 画像（任意）
    $cur = (string)$it['image'];
    $h .= '<div class="fld"><label class="fld-label">画像（任意）</label>';
    if ($cur !== '') {
        $h .= '<div class="listnews-thumb-cur"><img src="' . h(upload_url($cur)) . '" alt=""></div>';
    }
    $h .= '<input type="file" name="image" accept="image/*">';
    $h .= '<span class="fld-hint">' . h(cms_upload_formats_note()) . '</span></div>';

    // 公開状態
    $pub = ((string)$it['status'] !== 'hidden');
    $h .= '<div class="fld"><label class="fld-label">公開状態</label><select name="status">'
        . '<option value="public"' . ($pub ? ' selected' : '') . '>公開する</option>'
        . '<option value="hidden"' . (!$pub ? ' selected' : '') . '>非公開（下書き）</option>'
        . '</select></div>';
    return $h;
}

$items = listnews_items(false, 0); // 非公開も含めて管理表示

admin_header('お知らせ管理', 'listnews');
?>
<h1 class="adm-h1">お知らせ管理</h1>
<?php flash_render(); ?>
<div class="adm-guide">
  ここで<strong>お知らせ記事を追加・編集</strong>します。記事は新しい日付順で並びます。
  サイトに表示するには、ページに<strong>「お知らせ一覧」パーツ</strong>を置いてください
  （初期状態では<a href="<?= h(page_url('news')) ?>" target="_blank" rel="noopener">お知らせページ</a>に設置済みです）。
  各記事は詳細ページ（<code>?p=news&id=…</code>）にリンクします。
</div>

<?php if (!$items): ?>
  <p class="adm-empty">お知らせがありません。下から追加してください。</p>
<?php endif; ?>

<?php foreach ($items as $it):
    $isHidden = ((string)$it['status'] === 'hidden');
?>
  <div class="adm-block is-collapsed" id="ni-<?= (int)$it['id'] ?>">
    <div class="adm-block-head">
      <button type="button" class="adm-block-label" data-block-toggle aria-expanded="false">
        <span class="block-chevron" aria-hidden="true">▶</span>
        <?= h(listnews_format_date((string)$it['item_date'])) ?>　<?= h((string)$it['title']) ?>
        <?php if ($isHidden): ?><span class="menu-target-badge">非公開</span><?php endif; ?>
      </button>
      <span class="adm-block-tools">
        <a class="adm-btn ghost sm" href="<?= h(listnews_detail_url((int)$it['id'])) ?>" target="_blank" rel="noopener">表示 ↗</a>
        <form method="post" style="display:inline" onsubmit="return confirm('このお知らせを削除しますか？');">
          <input type="hidden" name="_csrf" value="<?= h(csrf_token()) ?>">
          <input type="hidden" name="action" value="delete_item">
          <input type="hidden" name="id" value="<?= (int)$it['id'] ?>">
          <button class="adm-btn danger sm" type="submit">削除</button>
        </form>
      </span>
    </div>
    <form method="post" class="adm-form" enctype="multipart/form-data">
      <input type="hidden" name="_csrf" value="<?= h(csrf_token()) ?>">
      <input type="hidden" name="action" value="save_item">
      <input type="hidden" name="id" value="<?= (int)$it['id'] ?>">
      <?= listnews_fields_html($it) ?>
      <button class="adm-btn primary" type="submit">保存</button>
    </form>
  </div>
<?php endforeach; ?>

<!-- 追加（既定で閉じる） -->
<div class="adm-block is-collapsed adm-add-card" id="add-news-item">
  <div class="adm-block-head">
    <button type="button" class="adm-block-label" data-block-toggle aria-expanded="false">
      <span class="block-chevron" aria-hidden="true">▶</span>＋ お知らせを追加
    </button>
  </div>
  <form method="post" class="adm-form" enctype="multipart/form-data">
    <input type="hidden" name="_csrf" value="<?= h(csrf_token()) ?>">
    <input type="hidden" name="action" value="add_item">
    <?= listnews_fields_html(['status' => 'public']) ?>
    <button class="adm-btn primary" type="submit">追加</button>
  </form>
</div>

<style>
.listnews-thumb-cur{margin-bottom:.5rem;}
.listnews-thumb-cur img{max-width:180px;height:auto;border-radius:6px;border:1px solid var(--adm-border,#e5e7eb);}
</style>

<?php admin_footer(); ?>
