"""Scheduler de notificaciones usando Clawdbot Cron (sin Telegram)."""
import json
import os
import subprocess
from datetime import datetime
from pathlib import Path

CLAWDBOT_BIN = os.environ.get("CLAWDBOT_BIN", "clawdbot")
NAME_PREFIX = os.environ.get("HEALTH_CRON_NAME_PREFIX", "Health reminder")
DRY_RUN = os.environ.get("DRY_RUN") == "1"
CRON_TIMEOUT_MS = int(os.environ.get("CRON_TIMEOUT_MS", "30000"))
SUBPROCESS_TIMEOUT_S = int(os.environ.get("CRON_SUBPROCESS_TIMEOUT_S", "10"))
CRON_SESSION = os.environ.get("HEALTH_CRON_SESSION", "main")
BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
SCHEDULE_PATH = Path(BASE_DIR) / "data" / "scheduled_notifications.json"


def _load():
    if not SCHEDULE_PATH.exists():
        return []
    with open(SCHEDULE_PATH, "r", encoding="utf-8") as f:
        return json.load(f)


def _save(items):
    SCHEDULE_PATH.parent.mkdir(parents=True, exist_ok=True)
    with open(SCHEDULE_PATH, "w", encoding="utf-8") as f:
        json.dump(items, f, ensure_ascii=False, indent=2)


def _build_name(message, name=None):
    if name:
        return name
    snippet = (message or "").strip().replace("\n", " ")
    if len(snippet) > 40:
        snippet = snippet[:37] + "..."
    return f"{NAME_PREFIX}: {snippet}" if snippet else NAME_PREFIX


def _already_scheduled(items, when_iso, message):
    return any(
        i.get("when") == when_iso and i.get("message") == message for i in items
    )


def schedule_message(when_iso, message, name=None, delete_after=True):
    """Agenda un recordatorio via Clawdbot Cron.

    - when_iso: ISO datetime (YYYY-MM-DDTHH:MM:SS) o +duración (ej: 20m)
    - message: texto del recordatorio
    - name: nombre opcional del job
    """
    items = _load()
    if _already_scheduled(items, when_iso, message):
        return

    job_name = _build_name(message, name)
    prompt = (
        "Enviá este recordatorio al usuario, verbatim, sin agregar nada extra:\n"
        f"{message}"
    )

    cmd = [
        CLAWDBOT_BIN,
        "cron",
        "add",
        "--name",
        job_name,
        "--at",
        when_iso,
        "--session",
        CRON_SESSION,
    ]

    # main session requires system-event
    if CRON_SESSION == "main":
        cmd += ["--system-event", prompt]
    else:
        cmd += ["--message", prompt, "--deliver"]

    cmd += ["--timeout", str(CRON_TIMEOUT_MS)]

    if delete_after:
        cmd.append("--delete-after-run")

    try:
        if DRY_RUN:
            print("DRY_RUN cron add:", " ".join(cmd))
        else:
            subprocess.run(
                cmd,
                check=True,
                timeout=SUBPROCESS_TIMEOUT_S,
                stdout=subprocess.DEVNULL,
                stderr=subprocess.DEVNULL,
            )
    except subprocess.TimeoutExpired:
        print(f"ERROR cron add timeout for {when_iso}")
        return
    except subprocess.CalledProcessError as e:
        print(f"ERROR cron add for {when_iso}: {e}")
        return

    items.append({"when": when_iso, "message": message, "created_at": datetime.now().isoformat()})
    _save(items)


def process_due(now=None):
    """Compatibilidad: Clawdbot Cron maneja los envíos."""
    _ = now or datetime.now()
    return None
