import { app, adminApp } from "@/firebase";
import { AgentUser } from "@/interfaces/user";
import { sessionOptions } from "@/lib/session";
import {
  collection,
  getDocs,
  getFirestore,
  query,
  where,
} from "firebase/firestore";
import { getAuth } from "firebase-admin/auth";
import { withIronSessionApiRoute } from "iron-session/next";
import { NextApiRequest, NextApiResponse } from "next";
import countryCodes from "country-codes-list";
const db = getFirestore(app);
const auth = getAuth(adminApp);

export default withIronSessionApiRoute(user, sessionOptions);

interface Contact {
  name: string;
  email: string;
  number: string;
}
async function get(req: NextApiRequest, res: NextApiResponse) {
  const { language = "en" } = req.query as { language: string };

  const usersQuery = query(
    collection(db, "users"),
    where("type", "==", "agent"),
  );
  const docsUser = await getDocs(usersQuery);

  const docs = docsUser.docs.map((doc) => doc.data() as AgentUser);

  const data = docs.reduce(
    (acc: Record<string, Contact[]>, user: AgentUser) => {
      const countryCode = user.demographicInformation?.country as string;
      const currentValues = acc[countryCode] || ([] as Contact[]);
      const newUser = {
        name:
          (language === "en"
            ? user.agentInformation?.companyName
            : user.agentInformation?.companyArabName ||
              user.agentInformation?.companyName) || user.name,
        email: user.email,
        number: user.demographicInformation?.phone as string,
      } as Contact;
      return {
        ...acc,
        [countryCode]: [...currentValues, newUser],
      };
    },
    {},
  ) as Record<string, Contact[]>;

  const result = Object.keys(data).map((code) => {
    const country = countryCodes.findOne(
      "countryCode" as any,
      code.toUpperCase(),
    );
    if (!country) return null;
    const key = language === "ar" ? "countryNameLocal" : "countryNameEn";
    return {
      label: country[key],
      key: code,
      entries: data[code],
    };
  });

  res.json(result.filter((x) => !!x));
}

async function user(req: NextApiRequest, res: NextApiResponse) {
  if (req.method === "GET") return get(req, res);
}
