import { validateLinkedInScopes } from "@/lib/social/linkedin-scopes";
import {
  resolveMetaScopes,
  validateMetaScopes,
} from "@/lib/social/meta-scopes";

export function getAppUrl() {
  return process.env.NEXT_PUBLIC_APP_URL ?? "http://localhost:3033";
}

/** Meta (Facebook/Instagram) must fetch image URLs from the public internet. */
export function isPubliclyReachableAppUrl(url: string): boolean {
  try {
    const host = new URL(url).hostname.toLowerCase();
    if (host === "localhost" || host === "127.0.0.1" || host.endsWith(".local")) {
      return false;
    }
    if (/^10\./.test(host) || /^192\.168\./.test(host) || /^172\.(1[6-9]|2\d|3[01])\./.test(host)) {
      return false;
    }
    return true;
  } catch {
    return false;
  }
}

export function getApiUrl() {
  return process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:4044/api/v1";
}

/** Redirect URI for LinkedIn OAuth when connecting a project social account. */
export function getSocialLinkedInRedirectUri() {
  return (
    process.env.LINKEDIN_SOCIAL_REDIRECT_URI ??
    `${getAppUrl()}/connected-accounts/oauth/linkedin/callback`
  );
}

export function getMetaRedirectUri(platform: "facebook" | "instagram" = "facebook") {
  if (platform === "instagram") {
    return (
      process.env.META_INSTAGRAM_REDIRECT_URI ??
      process.env.INSTAGRAM_REDIRECT_URI ??
      `${getAppUrl()}/connected-accounts/oauth/instagram/callback`
    );
  }
  return (
    process.env.META_SOCIAL_REDIRECT_URI ??
    process.env.FACEBOOK_SOCIAL_REDIRECT_URI ??
    process.env.FACEBOOK_REDIRECT_URI ??
    `${getAppUrl()}/connected-accounts/oauth/facebook/callback`
  );
}

export function getYouTubeRedirectUri() {
  return (
    process.env.YOUTUBE_SOCIAL_REDIRECT_URI ??
    `${getAppUrl()}/connected-accounts/oauth/youtube/callback`
  );
}

export function getMetaGraphVersion() {
  return process.env.META_GRAPH_VERSION?.trim() || "v21.0";
}

export function getMetaGraphBase() {
  return `https://graph.facebook.com/${getMetaGraphVersion()}`;
}

export function getMetaConfig() {
  const facebookScopes = resolveMetaScopes(
    "facebook",
    process.env.META_FACEBOOK_SCOPES,
    process.env.META_INSTAGRAM_SCOPES,
  );
  const instagramScopes = resolveMetaScopes(
    "instagram",
    process.env.META_FACEBOOK_SCOPES,
    process.env.META_INSTAGRAM_SCOPES,
  );

  return {
    appId: process.env.META_APP_ID ?? process.env.FACEBOOK_CLIENT_ID ?? "",
    appSecret: process.env.META_APP_SECRET ?? process.env.FACEBOOK_CLIENT_SECRET ?? "",
    redirectUri: getMetaRedirectUri("facebook"),
    graphVersion: getMetaGraphVersion(),
    graphBase: getMetaGraphBase(),
    facebookScopes,
    instagramScopes,
    facebookScopeValidation: validateMetaScopes("facebook", facebookScopes),
    instagramScopeValidation: validateMetaScopes("instagram", instagramScopes),
  };
}

export function getYouTubeConfig() {
  return {
    clientId: process.env.GOOGLE_CLIENT_ID ?? process.env.YOUTUBE_CLIENT_ID ?? "",
    clientSecret: process.env.GOOGLE_CLIENT_SECRET ?? process.env.YOUTUBE_CLIENT_SECRET ?? "",
    redirectUri: getYouTubeRedirectUri(),
    scopes:
      process.env.YOUTUBE_SCOPES ??
      "https://www.googleapis.com/auth/youtube.readonly https://www.googleapis.com/auth/youtube.upload",
  };
}

export function getLinkedInConfig() {
  const scopes =
    process.env.LINKEDIN_SCOPES ?? "r_liteprofile r_emailaddress w_member_social";
  return {
    clientId: process.env.LINKEDIN_CLIENT_ID ?? "",
    clientSecret: process.env.LINKEDIN_CLIENT_SECRET ?? "",
    redirectUri: getSocialLinkedInRedirectUri(),
    scopes,
    scopeValidation: validateLinkedInScopes(scopes),
  };
}
