/**
 * Verifies Admin SDK can send FCM (catches IAM / mismatched-credential).
 *
 * Usage:
 *   npx ts-node src/scripts/debugPushNotifications.ts
 *   npx ts-node src/scripts/debugPushNotifications.ts <fcmToken>
 */
import "../loadEnv";
import mongoose from "mongoose";
import { MONGODB_CONNECTION_STRING } from "../config/environment";
import {
  getFirebaseMessaging,
  getFirebaseProjectId,
  initFirebaseAdmin,
} from "../config/firebase";

const EMAILS = ["shan4@yopmail.com", "shan2@yopmail.com", "jacky@yopmail.com"];

const IAM_HELP = `
===== FCM IAM FIX (required — Console test ≠ Admin SDK) =====
1. Open: https://console.cloud.google.com/iam-admin/iam?project=tanktrack-client-prod
2. Find: firebase-adminsdk-fbsvc@tanktrack-client-prod.iam.gserviceaccount.com
3. Edit → add role: "Firebase Cloud Messaging API Admin"
   (or "Firebase Admin")
4. Also enable API:
   https://console.cloud.google.com/apis/library/fcm.googleapis.com?project=tanktrack-client-prod
5. Restart API server, then re-run this script / send a connection request.
=============================================================
`;

async function trySend(token: string, label: string): Promise<boolean> {
  const messaging = getFirebaseMessaging();
  if (!messaging) {
    console.error("Firebase not initialized");
    return false;
  }
  try {
    const id = await messaging.send({
      token,
      notification: {
        title: "Tank Track IAM test",
        body: "Backend FCM works",
      },
      data: {
        type: "connection",
        eventType: "request_received",
        debug: "1",
      },
    });
    console.log(`OK ${label}:`, id);
    return true;
  } catch (err: unknown) {
    const info = (err as { errorInfo?: { code?: string; message?: string } })
      ?.errorInfo;
    const code = info?.code ?? "";
    const message =
      info?.message ?? (err instanceof Error ? err.message : String(err));
    console.error(`FAIL ${label}:`, code || message);
    if (
      code === "messaging/mismatched-credential" ||
      message.includes("cloudmessaging.messages.create")
    ) {
      console.error(IAM_HELP);
    }
    return false;
  }
}

async function main() {
  const cliToken = process.argv[2]?.trim();

  const firebaseOk = initFirebaseAdmin();
  console.log("[check] firebase initialized:", firebaseOk);
  console.log("[check] project:", getFirebaseProjectId());

  if (cliToken) {
    await trySend(cliToken, "cli-token");
    return;
  }

  if (!MONGODB_CONNECTION_STRING) {
    throw new Error("No Mongo URI");
  }
  await mongoose.connect(MONGODB_CONNECTION_STRING);
  const db = mongoose.connection.db!;

  const users = await db
    .collection("users")
    .find({ email: { $in: EMAILS } })
    .project({ email: 1 })
    .toArray();

  let anyOk = false;
  for (const u of users) {
    const devices = await db
      .collection("devices")
      .find({ userId: u._id, status: true })
      .toArray();
    const tokens = devices
      .map((d) => String(d.deviceToken || "").trim())
      .filter((t) => t.length > 40);

    console.log(`\n=== ${u.email} devices=${tokens.length} ===`);
    if (tokens.length === 0) {
      console.log("SKIP: no real FCM tokens");
      continue;
    }
    const ok = await trySend(tokens[0], u.email as string);
    anyOk = anyOk || ok;
  }

  if (!anyOk) {
    console.error("\nNo successful FCM send. Most likely IAM — see help above.");
  }

  await mongoose.disconnect();
}

main().catch((e) => {
  console.error(e);
  process.exit(1);
});
