#!/usr/bin/env python3
"""
create-reminder.py -- Create typed reminders with automatic lead-time alerts.

Usage:
  python3 create-reminder.py --type call     --datetime "2026-02-28 14:00" --label "rj-call"   --message "Call with RJ"
  python3 create-reminder.py --type meeting  --datetime "2026-03-05 10:00" --label "dentist"   --message "Dentist appointment"
  python3 create-reminder.py --type travel   --datetime "2026-03-10 08:00" --label "flight-atl" --message "Flight to Atlanta"
  python3 create-reminder.py --type deadline --datetime "2026-03-01 17:00" --label "tax-filing" --message "Tax filing deadline"

Lead times by type:
  call     → -15 min, -1 min
  meeting  → -60 min, -1 min
  travel   → -3 hr,   -30 min
  deadline → -1 day (9am),  -1 hr
"""

import argparse, os, subprocess, sys
from datetime import datetime, timedelta

LAUNCHAGENT_DIR = os.path.expanduser("~/Library/LaunchAgents")
SIGNAL_GROUP    = "group:p8qyD5GHbTsBk/ga1fhWkvWOlkq3h+91+jRDFQ8I8H8="
OPENCLAW        = "/opt/homebrew/bin/openclaw"
SCHEDULE_MD     = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "SCHEDULE.md")

# (minutes_before, human_label)
LEAD_TIMES = {
    "call":     [(15, "15 minutes"), (1, "1 minute")],
    "meeting":  [(60, "1 hour"),     (1, "1 minute")],
    "travel":   [(180, "3 hours"),   (30, "30 minutes")],
    "deadline": [(1440, "tomorrow"), (60, "1 hour")],
}

PLIST_TEMPLATE = """\
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key><string>{label}</string>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/homebrew/bin/openclaw</string>
        <string>message</string>
        <string>send</string>
        <string>--channel</string><string>signal</string>
        <string>--target</string><string>{group}</string>
        <string>--message</string><string>{message}</string>
    </array>
    <key>EnvironmentVariables</key>
    <dict><key>PATH</key><string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string></dict>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Year</key><integer>{year}</integer>
        <key>Month</key><integer>{month}</integer>
        <key>Day</key><integer>{day}</integer>
        <key>Hour</key><integer>{hour}</integer>
        <key>Minute</key><integer>{minute}</integer>
    </dict>
    <key>RunAtLoad</key><false/>
</dict>
</plist>"""


def slug_for(lead_minutes):
    if lead_minutes >= 1440:
        return "1day"
    if lead_minutes >= 60:
        return f"{lead_minutes // 60}hr"
    return f"{lead_minutes}min"


def build_message(base_message, lead_minutes, event_dt):
    time_str = event_dt.strftime("%-I:%M%p").lower().replace(":00", "")
    if lead_minutes == 1:
        return f"REMINDER: {base_message} -- starting NOW ({time_str})"
    if lead_minutes >= 1440:
        days = lead_minutes // 1440
        return f"REMINDER: {base_message} is tomorrow ({time_str})"
    if lead_minutes >= 60:
        hrs = lead_minutes // 60
        return f"REMINDER: {base_message} in {hrs} hour{'s' if hrs > 1 else ''} ({time_str})"
    return f"REMINDER: {base_message} in {lead_minutes} minutes ({time_str})"


def create_plist(full_label, fire_dt, message):
    content = PLIST_TEMPLATE.format(
        label=full_label,
        group=SIGNAL_GROUP,
        message=message,
        year=fire_dt.year,
        month=fire_dt.month,
        day=fire_dt.day,
        hour=fire_dt.hour,
        minute=fire_dt.minute,
    )
    path = os.path.join(LAUNCHAGENT_DIR, f"{full_label}.plist")
    with open(path, "w") as f:
        f.write(content)
    result = subprocess.run(["launchctl", "load", path], capture_output=True)
    ok = result.returncode == 0
    return path, ok


def main():
    parser = argparse.ArgumentParser(description="Create typed reminders with lead-time alerts.")
    parser.add_argument("--type",     required=True, choices=list(LEAD_TIMES.keys()))
    parser.add_argument("--datetime", required=True, help="YYYY-MM-DD HH:MM")
    parser.add_argument("--label",    required=True, help="short slug, e.g. rj-call")
    parser.add_argument("--message",  required=True, help="reminder text shown in Signal")
    args = parser.parse_args()

    try:
        event_dt = datetime.strptime(args.datetime, "%Y-%m-%d %H:%M")
    except ValueError:
        print("Error: --datetime must be YYYY-MM-DD HH:MM", file=sys.stderr)
        sys.exit(1)

    leads = LEAD_TIMES[args.type]
    print(f"\nCreating {args.type} reminder: {args.message}")
    print(f"Scheduled: {event_dt.strftime('%Y-%m-%d %H:%M')}\n")

    for lead_minutes, _ in leads:
        fire_dt     = event_dt - timedelta(minutes=lead_minutes)
        full_label  = f"clawstin.reminder.{args.label}-{slug_for(lead_minutes)}"
        msg         = build_message(args.message, lead_minutes, event_dt)
        path, ok    = create_plist(full_label, fire_dt, msg)
        status      = "OK" if ok else "FAILED"
        print(f"  [{status}] {fire_dt.strftime('%Y-%m-%d %H:%M')} -- {msg}")

    # Auto-append to SCHEDULE.md
    schedule_entry = f"{event_dt.strftime('%Y-%m-%d %H:%M')} -- {args.message}\n"
    try:
        with open(SCHEDULE_MD, "r") as f:
            existing = f.read()
        if schedule_entry.strip() not in existing:
            with open(SCHEDULE_MD, "a") as f:
                f.write(schedule_entry)
            print(f"  [SCHEDULE] Added to SCHEDULE.md")
        else:
            print(f"  [SCHEDULE] Already in SCHEDULE.md, skipped")
    except Exception as e:
        print(f"  [SCHEDULE] WARNING: Could not update SCHEDULE.md: {e}", file=sys.stderr)

    print(f"\nDone. {len(leads)} alert(s) loaded.")


if __name__ == "__main__":
    main()
