import { DateTime } from 'luxon';
/** Luxon weekday: 1 = Monday … 7 = Sunday. */
export type LuxonWeekday = 1 | 2 | 3 | 4 | 5 | 6 | 7;
export type ChlorinationHabitationRow = {
    name: string;
    value: string;
};
export type ChlorinationReportDataBlock = {
    sNo: number;
    date: string;
    remark?: string;
    habitations: ChlorinationHabitationRow[];
};
/** Deterministic weekday 1–7 from a stable seed (scheme + billing period). */
export declare function selectWeekdayForReport(seed: string): LuxonWeekday;
/** Inclusive wall-date range in `zone`; occurrences of `weekday`, earliest first. */
export declare function listWeekdayOccurrencesInInclusiveRange(from: DateTime, to: DateTime, weekday: LuxonWeekday, zone: string): DateTime[];
/**
 * Picks a weekday that has at least one occurrence in range; if seed's weekday has none,
 * probes other weekdays deterministically until one fits.
 */
export declare function selectWeekdayWithOccurrenceInRange(seed: string, from: DateTime, to: DateTime, zone: string): LuxonWeekday;
/**
 * Picks a **non-Sunday** weekday (Mon–Sat) that has at least one occurrence in the bill period.
 * Uses `rng` so each job run can get a different day; Sunday (7) is never chosen.
 */
export declare function selectRandomNonSundayWeekdayWithOccurrenceInRange(from: DateTime, to: DateTime, zone: string, rng?: () => number): LuxonWeekday;
/**
 * Random residual chlorine from discrete tenths in [0.2, 0.5].
 */
export declare function generateResidualChlorinePpm(rng?: () => number): number;
export declare function buildChlorinationReportData(params: {
    measurementDates: DateTime[];
    villageNames: string[];
    timezone: string;
    rng?: () => number;
}): ChlorinationReportDataBlock[];
//# sourceMappingURL=chlorinationReport.d.ts.map