import fs from "fs";
import path from "path";
import * as admin from "firebase-admin";

let initialized = false;
let initProjectId: string | null = null;

/**
 * Resolve Firebase service-account JSON path.
 * Prefer FIREBASE_SERVICE_ACCOUNT_PATH; else default prod admin SDK file under src/config.
 */
function resolveServiceAccountPath(): string | null {
  const fromEnv = process.env.FIREBASE_SERVICE_ACCOUNT_PATH?.trim();
  if (fromEnv) {
    const resolved = path.isAbsolute(fromEnv)
      ? fromEnv
      : path.resolve(process.cwd(), fromEnv);
    if (fs.existsSync(resolved)) return resolved;
    console.warn(
      `[firebase] FIREBASE_SERVICE_ACCOUNT_PATH not found: ${resolved}`,
    );
  }

  const defaultName =
    "tanktrack-client-prod-firebase-adminsdk-fbsvc-710e481dd5.json";
  const candidates = [
    path.resolve(__dirname, defaultName),
    path.resolve(process.cwd(), "src", "config", defaultName),
  ];
  for (const p of candidates) {
    if (fs.existsSync(p)) return p;
  }
  return null;
}

/**
 * Initialize firebase-admin once. Safe to call repeatedly.
 * Returns false when credentials are missing (push becomes no-op).
 */
export function initFirebaseAdmin(): boolean {
  if (initialized) return true;
  if (admin.apps.length > 0) {
    initialized = true;
    return true;
  }

  const saPath = resolveServiceAccountPath();
  if (!saPath) {
    console.warn(
      "[firebase] No service account JSON — FCM push disabled until configured",
    );
    return false;
  }

  try {
    const raw = fs.readFileSync(saPath, "utf8");
    const serviceAccount = JSON.parse(raw) as admin.ServiceAccount & {
      project_id?: string;
      client_email?: string;
    };
    const projectId =
      serviceAccount.project_id ||
      process.env.FIREBASE_PROJECT_ID?.trim() ||
      undefined;

    admin.initializeApp({
      credential: admin.credential.cert(serviceAccount),
      projectId,
    });
    initialized = true;
    initProjectId = projectId ?? null;
    console.log(
      `[firebase] Admin SDK initialized file=${path.basename(saPath)} project=${projectId ?? "?"} sa=${serviceAccount.client_email ?? "?"}`,
    );
    return true;
  } catch (err) {
    console.error("[firebase] Failed to initialize Admin SDK", err);
    return false;
  }
}

export function getFirebaseProjectId(): string | null {
  return initProjectId;
}

export function getFirebaseMessaging(): admin.messaging.Messaging | null {
  if (!initFirebaseAdmin()) return null;
  return admin.messaging();
}
