import webpush from "web-push";
import { env } from "../config/env.js";
import { recordAppEvent } from "./app-log.js";

interface PushSubscriptionLike {
  endpoint: string;
  p256dh_key: string;
  auth_key: string;
}

function isConfigured(): boolean {
  return Boolean(env.VAPID_PUBLIC_KEY && env.VAPID_PRIVATE_KEY && env.VAPID_SUBJECT);
}

let configured = false;

function ensureConfigured(): boolean {
  if (configured) return true;
  if (!isConfigured()) return false;
  webpush.setVapidDetails(env.VAPID_SUBJECT, env.VAPID_PUBLIC_KEY, env.VAPID_PRIVATE_KEY);
  configured = true;
  return true;
}

export async function sendPushNotification(
  subscription: PushSubscriptionLike,
  payload: Record<string, unknown>
): Promise<"sent" | "skipped" | "failed" | "expired"> {
  if (!ensureConfigured()) {
    return "skipped";
  }

  try {
    await webpush.sendNotification(
      {
        endpoint: subscription.endpoint,
        keys: {
          p256dh: subscription.p256dh_key,
          auth: subscription.auth_key,
        },
      },
      JSON.stringify(payload)
    );
    return "sent";
  } catch (err) {
    const statusCode = typeof err === "object" && err !== null && "statusCode" in err
      ? Number((err as { statusCode?: number }).statusCode ?? 0)
      : 0;
    await recordAppEvent({
      level: "warning",
      source: "push.delivery",
      message: err instanceof Error ? err.message : "Push delivery failed",
      details: {
        endpoint: subscription.endpoint,
        statusCode: statusCode || null,
      },
    });
    if (statusCode === 404 || statusCode === 410) {
      return "expired";
    }
    return "failed";
  }
}
