/**
 * 制御盤（ラズパイ）のログの中継の設定値（指示書AY 段階3-1。D-179・監督判断 第2ラウンド M1〜M5・D9）。
 *
 * ★`lib/config/index.ts` に足さないこと・`index.ts` を import しないこと★
 *   `index.ts` は `lib/judge/` から広く import されており、ここを `proxy` から読むと
 *   proxy のバンドルに judge 系を引き込む（`lib/config/allowed-ips.ts` の冒頭と同じ理由）。
 * ★`node:` の import を持たないこと★ — 画面（`components/`）からも import する。
 * ★ハードコード禁止（CLAUDE.md §7）★ — 中継・検証・画面はここから読む。
 *
 * ★リクエストを待たせる値（15 / 25 / 30 / 45 / 50秒）は、どれも nginx の `proxy_read_timeout`（既定60秒）より
 * 短くすること★。60秒以上にすると nginx が先に接続を切り、ブラウザ・制御盤には 504 しか見えない（4-10）。
 */

/**
 * ポーリング（`GET /api/ds-agent/commands?wait=`）の待ちの上限（秒）。`wait` の最大かつ既定。
 * ★nginx の `proxy_read_timeout`（既定60秒）より短くすること★。出所: D-179・D2。
 */
export const AGENT_POLL_WAIT_SEC = 25;

/**
 * 最後のリクエストからこれを★超えたら★未接続（秒）。ちょうどは接続中（表5 R4）。
 * 認証の通った制御盤のすべてのリクエストで最終接続日時を更新する（D19。M4）。
 * ポーリングの待ち（25秒）の2回分より長くし、ポーリングの切れ目で未接続にならないようにする。
 */
export const AGENT_OFFLINE_AFTER_SEC = 60;

/**
 * ブラウザの一覧の依頼から、制御盤の結果を待つ上限（秒）。
 * ★nginx の `proxy_read_timeout`（既定60秒）より短くすること★。出所: D-179。
 */
export const LIST_TIMEOUT_SEC = 15;

/**
 * 制御盤が zip を作り終えて prepared を送るまで、エクスポートの準備の POST が待つ上限（秒。D14。M1）。
 * ★nginx の `proxy_read_timeout`（既定60秒）より短くすること★。
 */
export const EXPORT_PREPARE_TIMEOUT_SEC = 50;

/**
 * 準備の 201 から、ダウンロード URL を開く（GET）までの上限（秒）。応答の `expires_in_sec`。
 * 過ぎたらエクスポートを失効させて進行中から外す（D25 ⑤）。制御盤は120秒で zip を消すので、それより短い。
 */
export const EXPORT_CLAIM_TIMEOUT_SEC = 60;

/**
 * ダウンロード URL を開いてから最初のチャンクが届くまでの上限（秒。D14）。それまでは JSON のエラーで返せる。
 * ★nginx の `proxy_read_timeout`（既定60秒）より短くすること★。
 */
export const EXPORT_FIRST_CHUNK_TIMEOUT_SEC = 30;

/**
 * 流し始めた後のチャンクの間隔の上限、かつチャンクの POST に 204 を返すまで保留する上限（秒。流量制御。D20・M5）。
 * 超えたら 410 `export_cancelled` にしてエクスポートを失敗にする。制御盤のチャンクの POST のタイムアウトは60秒（設計書）。
 * ★nginx の `proxy_read_timeout`（既定60秒）より短くすること★。
 */
export const EXPORT_IDLE_TIMEOUT_SEC = 45;

/**
 * 1チャンクの上限（バイト。D1）。
 * ★proxy は本体を10MBまでメモリにバッファし、超えた分を黙って切り捨てる★ので、それより十分小さくする
 * （`proxyClientMaxBodySize` を上げて解決しない。4-1）。
 */
export const CHUNK_MAX_BYTES = 4 * 1024 * 1024;

/** 1回の zip の上限（バイト。★仮★。D-179 追記 項5）。上限の判定は zip のバイト数に一本化する（D15） */
export const EXPORT_MAX_BYTES = 100 * 1024 * 1024;

/** 1回に選べるファイル数の上限（D-179。制御盤側の上限と同じ値） */
export const EXPORT_MAX_FILES = 500;

/**
 * 1回のエクスポートで選ぶ `file_ids` を JSON にした大きさ（UTF-8 のバイト数）の上限（指示書BK K7）。
 * ★制御盤は D-Watch の応答を 64KB までしか読まない★（`agent.py` の `RESPONSE_READ_MAX_BYTES`）。
 * エクスポートの指示は poll の応答に `file_ids` を全部入れて届くので、外側の項目（約140バイト）の分を残して 48KB にする。
 * ★64KB に近づけない★（超えると指示が途中で切れ、ブラウザは 50秒待って 504 になる）
 */
export const EXPORT_FILE_IDS_MAX_BYTES = 48 * 1024;

/** 制御盤ごとの同時エクスポートの上限（準備中〜流れ中を進行中に数える。D25 ⑤） */
export const EXPORT_CONCURRENCY_PER_DEVICE = 1;

/** 全体の同時エクスポートの上限（チャンクはメモリで中継するので、メモリの使い方を抑える。D-179） */
export const EXPORT_CONCURRENCY_TOTAL = 3;

/** 制御盤から来る一覧の結果の本体の上限（バイト。D18・M3）。制御盤はここで打ち切り `truncated: true` にする */
export const LIST_RESULT_MAX_BYTES = 4 * 1024 * 1024;

/** 一覧の件数の上限（D18・M3）。制御盤は更新日時の新しい順に並べてから、ここで打ち切り `truncated: true` にする */
export const LIST_RESULT_MAX_ITEMS = 20000;

/** 制御盤ごとの指示の待ち行列の上限。満杯なら 429 `agent_busy`（D23） */
export const PENDING_COMMANDS_PER_DEVICE = 5;

/**
 * ★画面の★ページあたり件数の選択肢（M7）。上限は `PAGINATION.maxPerPage`（`lib/config/index.ts`）と同じ 200。
 * ★API の検証には使わない★（API は `per_page` を 1〜200 に丸める）。
 */
export const DS_LOG_PER_PAGE_OPTIONS: readonly number[] = [50, 100, 200];

/** ページあたり件数の既定（`per_page` が省略・空・数でないときの値。M7） */
export const DS_LOG_DEFAULT_PER_PAGE = 200;

/**
 * パスの `export_id` の長さの上限（M8）。`crypto.randomUUID()` の36文字を受けられる長さ。
 * ★文字種は絞らない★（`parsePathReportId()` と同じ作法。見つからなければ 404）。
 */
export const PATH_EXPORT_ID_MAX_LENGTH = 64;

/** パスの `command_id` の長さの上限（M8）。`PATH_EXPORT_ID_MAX_LENGTH` と同じ考え方 */
export const PATH_COMMAND_ID_MAX_LENGTH = 64;
