/**
* 清掃詳細ログ画面(F-02。`components/features/detail-log/DetailLogScreen.tsx`)の
* ★期間(`date_from` / `date_to`)の扱い★。★純粋関数のみ★(D-159 追記 / 指示書AV 段階5b)。
*
* ★画面の既定は「期間を指定しない(全期間)」★(ユーザー指示 2026-10-06「C」)—
* ダッシュボードは「各清掃エリアの直近の清掃(7日以内)」を出すので、既定を当日にすると
* 前日 19:00 の出発失敗がダッシュボードには出るのに、カードや「全項目 →」で移った先に出ない。
*
* ★画面のコンポーネントは vitest の `include`(`lib/**` / `app/**`)に入らない★ので、
* URL の組み立てと検証の条件だけをここに切り出してテストする
* (`lib/clean-logs/__tests__/detail-log-date-range.test.ts`)。
*
* ★API(`/api/clean-logs` / `/api/clean-logs/export`)は変えない★ — 期間なし=全期間、
* 片方だけ=その側だけの範囲、は `parseCleanLogQuery()`(`lib/clean-logs/query.ts`)の既存の挙動。
*/
import { inclusiveDayCount } from "@/lib/format/date";
/**
* 期間のクエリパラメータを足す。★空の側は付けない★(空文字の `date_from=` も送らない)。
*
* ★片方だけ入っているときは、入っている側だけを付ける★(その側だけで区切った範囲になる)。
* ★これは 5b 以前の画面の挙動と同じ★ — 以前も片方を消すと `date_from=`(空文字)が飛び、
* API は空の側を「指定なし」と読んでいた。「両方そろうまで送らない」「片方だけなら捨てる」は
* どちらも入力した日付が効かない時間ができるので採らない(指示書AV 段階5b-6)。
*/
export function appendDateRangeParams(
params: URLSearchParams,
dateFrom: string,
dateTo: string
): void {
if (dateFrom) params.set("date_from", dateFrom);
if (dateTo) params.set("date_to", dateTo);
}
/**
* 期間の検証。★両方入っているときだけ行う★(指示書AV 段階5b-2)。問題なければ `null`。
*
* ★文言・境界はサーバ(`parseCleanLogQuery()`)と同じ★ — 上限ちょうどは通す(`>`)、
* 開始=終了(1日)は通す。★画面は「親切」、サーバは「歯止め」★(APIを直接叩く経路が残る)。
* 形式が不正(`inclusiveDayCount()` が `null`)のときも画面では止めない(サーバが 422 を返す。従来どおり)。
*/
export function dateRangeError(
dateFrom: string,
dateTo: string,
maxDays: number
): string | null {
if (!dateFrom || !dateTo) return null;
const days = inclusiveDayCount(dateFrom, dateTo);
if (days === null) return null;
if (days > maxDays) {
return `date_from〜date_toは${maxDays}日以内で指定してください`;
}
if (days < 1) {
return "date_fromはdate_to以前の日付を指定してください";
}
return null;
}