/* eslint-disable no-console */

import { Types } from 'mongoose';

import config from '@/shared/config/config';
import { encrypt } from './crypto';
import {
  buildErrorHtml,
  buildOAuthUrl,
  buildState,
  buildSuccessHtml,
  encodeState,
  exchangeLongLiveToken,
  getAccessToken,
  getPages,
  savePageConnection,
  subscribePageToLeadgen,
} from './meta.helper';

export const authenticateCompanyMetaAccount = async (
  companyId: string | Types.ObjectId,
  userId: string,
) => {
  const state = encodeState(buildState(userId, companyId));
  return buildOAuthUrl(state);
};

export const companyMetaAccountCallback = async (
  companyId: string,
  userId: string,
  code: string,
) => {
  const errorUrl = `${config.clientUrl}/capture-leads?user=${encodeURIComponent(
    String(userId),
  )}&companyId=${encodeURIComponent(String(companyId))}&status=error`;

  try {
    // a) Access Tokens
    const accessToken = await getAccessToken(code);
    if (!accessToken) throw new Error('Missing access token');

    const longToken = await exchangeLongLiveToken(accessToken);

    // b) Pages
    const pages = await getPages(longToken);

    // c) Persist, subscribe, collect data
    const saved = [];
    await Promise.all(
      pages.map(async (p) => {
        await savePageConnection(p, userId, companyId, encrypt);
        await subscribePageToLeadgen(p.id, p.access_token);
        saved.push({ metaPageId: p.id, pageName: p.name });
      }),
    );

    // d) Success response
    const payload = {
      status: 'success',
      pages: saved.slice(0, 10),
    };
    return buildSuccessHtml(payload, config.clientUrl);
  } catch (err) {
    // Error page with redirect
    console.error('Meta callback error:', err);
    return buildErrorHtml(errorUrl);
  }
};
