{"files":{"main.py":"from core import run\nfrom policy import POLICY\n\n\ndef evaluate(payload):\n    return run(payload, POLICY)\n","policy.py":"POLICY = {\n    \"adjacency_allowed\": True,\n    \"blackout_day\": \"2026-11-01\",\n    \"cancelled_blocks\": True,\n    \"capacity\": 1,\n    \"cutoff_hour\": 17,\n    \"cutoff_inclusive\": True,\n    \"duplicate_policy\": \"first\",\n    \"duration_max\": 120,\n    \"lead_minutes\": 30,\n    \"priority_high_first\": True,\n    \"report_order\": \"id\",\n    \"timezone\": \"America/New_York\",\n}\n","helpers.py":"from datetime import datetime, timedelta, timezone\nimport math\n\n\nUTC = timezone.utc\n\n\ndef parse_instant(value):\n    if not isinstance(value, str):\n        raise ValueError(\"Expected an offset-aware ISO datetime\")\n    instant = datetime.fromisoformat(value)\n    if instant.tzinfo is None or instant.utcoffset() is None:\n        raise ValueError(\"Datetime must include an offset\")\n    return instant.astimezone(UTC)\n\n\ndef prepare_interval(row, earliest, zone, policy):\n    priority = row[\"priority\"]\n    if isinstance(priority, bool) or not isinstance(priority, int):\n        raise ValueError(\"Priority must be an integer\")\n    cancelled = row[\"cancelled\"]\n    if not isinstance(cancelled, bool):\n        raise ValueError(\"Cancelled must be a boolean\")\n    if cancelled and not policy[\"cancelled_blocks\"]:\n        raise ValueError(\"Cancelled appointment\")\n    duration = row[\"duration\"]\n    if isinstance(duration, bool) or not isinstance(duration, (int, float)):\n        raise ValueError(\"Invalid duration\")\n    if not 0 < duration <= policy[\"duration_max\"] or not math.isfinite(duration):\n        raise ValueError(\"Duration outside allowed range\")\n    start = parse_instant(row[\"start\"])\n    if start < earliest:\n        raise ValueError(\"Insufficient lead time\")\n    end = start + timedelta(minutes=duration)\n    local_start = start.astimezone(zone)\n    if local_start.date().isoformat() == policy[\"blackout_day\"]:\n        raise ValueError(\"Blackout day\")\n    cutoff = datetime(\n        local_start.year,\n        local_start.month,\n        local_start.day,\n        policy[\"cutoff_hour\"],\n        tzinfo=zone,\n    ).astimezone(UTC)\n    if policy[\"cutoff_inclusive\"]:\n        if end > cutoff:\n            raise ValueError(\"Ends after cutoff\")\n    elif end >= cutoff:\n        raise ValueError(\"Ends at or after cutoff\")\n    return start, end, cancelled, priority\n\n\ndef overlaps(left, right, adjacency_allowed):\n    if adjacency_allowed:\n        return left[0] < right[1] and right[0] < left[1]\n    return left[0] <= right[1] and right[0] <= left[1]\n\n\ndef report(entries, order):\n    if order == \"id\":\n        try:\n            ordered = sorted(entries, key=lambda item: item[0])\n        except TypeError:\n            ordered = sorted(entries, key=lambda item: (type(item[0]).__name__, str(item[0])))\n    else:\n        ordered = sorted(entries, key=lambda item: item[1])\n    return [identifier for identifier, index in ordered]\n","core.py":"from datetime import timedelta\nfrom zoneinfo import ZoneInfo\n\nfrom helpers import overlaps, parse_instant, prepare_interval, report\n\n\ndef run(payload, policy):\n    retained = []\n    for index, row in enumerate(payload[\"appointments\"]):\n        identifier = row[\"id\"]\n        position = next(\n            (position for position, entry in enumerate(retained) if entry[0] == identifier),\n            None,\n        )\n        entry = (identifier, index, row)\n        if position is None:\n            retained.append(entry)\n        elif policy[\"duplicate_policy\"] == \"last\":\n            retained[position] = entry\n\n    selected = []\n    blocked = []\n    rejected = []\n    try:\n        now = parse_instant(payload[\"now\"])\n        earliest = now + timedelta(minutes=policy[\"lead_minutes\"])\n    except (KeyError, TypeError, ValueError, OverflowError):\n        rejected = [(identifier, index) for identifier, index, row in retained]\n        return {\n            \"selected\": [],\n            \"blocked\": [],\n            \"rejected\": report(rejected, policy[\"report_order\"]),\n        }\n\n    zone = ZoneInfo(policy[\"timezone\"])\n    candidates = []\n    for identifier, index, row in retained:\n        try:\n            start, end, cancelled, priority = prepare_interval(row, earliest, zone, policy)\n        except (KeyError, TypeError, ValueError, OverflowError):\n            rejected.append((identifier, index))\n            continue\n        candidates.append((identifier, index, start, end, cancelled, priority))\n\n    candidates.sort(\n        key=lambda item: (\n            -item[5] if policy[\"priority_high_first\"] else item[5],\n            item[1],\n        )\n    )\n    accepted = []\n    for identifier, index, start, end, cancelled, priority in candidates:\n        interval = (start, end)\n        intersecting = sum(\n            overlaps(interval, previous, policy[\"adjacency_allowed\"])\n            for previous in accepted\n        )\n        if intersecting >= policy[\"capacity\"]:\n            rejected.append((identifier, index))\n            continue\n        accepted.append(interval)\n        destination = blocked if cancelled else selected\n        destination.append((identifier, index))\n\n    return {\n        \"selected\": report(selected, policy[\"report_order\"]),\n        \"blocked\": report(blocked, policy[\"report_order\"]),\n        \"rejected\": report(rejected, policy[\"report_order\"]),\n    }\n"}}