from datetime import date, datetime, timedelta from typing import List import pytz import re def clamp_days(n: int, min_v=1, max_v=30): return max(min_v, min(max_v, n)) def to_iso(d: date) -> str: return d.strftime("%Y-%m-%d") def parse_date_str(s: str) -> date: return datetime.strptime(s, "%Y-%m-%d").date() def compute_return_date(start: date, days: int) -> date: days = clamp_days(days) return start + timedelta(days=days) def format_price(amount: str, currency: str = "PKR") -> str: try: f = float(amount) return f"{currency} {f:,.0f}" except Exception: return f"{currency} {amount}" def day_list(start: date, days: int) -> List[date]: days = clamp_days(days) return [start + timedelta(days=i) for i in range(days)] def as_local(dt: datetime, tz="Asia/Karachi") -> datetime: return dt.astimezone(pytz.timezone(tz)) def is_iata_code(s: str) -> bool: return bool(re.fullmatch(r"[A-Z]{3}", s or ""))