import type { SupabaseClient, User } from "@supabase/supabase-js";

const ACCESS_TABLE = "cotizador_wmc_access";
const GLM_DOMAIN = "@gomezleemarketing.com";

export type CotizadorPermissions = {
  canUseTarifario: boolean;
};

export type AccessCheckResult =
  | { allowed: true; user: User; permissions: CotizadorPermissions }
  | {
      allowed: false;
      user: User | null;
      reason: "signed_out" | "unauthorized" | "verification_error";
      message: string;
    };

function normalizeEmail(email: string | null | undefined) {
  return (email ?? "").trim().toLowerCase();
}

function isMissingTarifarioColumn(error: { code?: string; message?: string } | null) {
  if (!error) return false;
  return error.code === "42703" || (error.message ?? "").includes("can_use_tarifario");
}

export async function checkCotizadorAccess(supabase: SupabaseClient): Promise<AccessCheckResult> {
  const {
    data: { user },
    error: userError,
  } = await supabase.auth.getUser();

  if (userError || !user) {
    return {
      allowed: false,
      user: null,
      reason: "signed_out",
      message: "No hay una sesión activa.",
    };
  }

  const email = normalizeEmail(user.email);

  if (!email.endsWith(GLM_DOMAIN)) {
    return {
      allowed: false,
      user,
      reason: "unauthorized",
      message:
        "Tu cuenta no tiene acceso al Cotizador Walmart Connect. Si necesitas acceso, contacta a IT.",
    };
  }

  const { data, error } = await supabase
    .from(ACCESS_TABLE)
    .select("email, is_active, can_use_tarifario")
    .eq("email", email)
    .eq("is_active", true)
    .maybeSingle();

  // Compatibilidad segura durante el despliegue: si el frontend se publica antes de
  // ejecutar la migración SQL, el usuario conserva el acceso general pero NO ve Tarifario.
  if (isMissingTarifarioColumn(error)) {
    const { data: fallbackData, error: fallbackError } = await supabase
      .from(ACCESS_TABLE)
      .select("email, is_active")
      .eq("email", email)
      .eq("is_active", true)
      .maybeSingle();

    if (fallbackError) {
      console.error("No se pudo validar el acceso al Cotizador Walmart Connect:", fallbackError);
      return {
        allowed: false,
        user,
        reason: "verification_error",
        message: "No se pudo validar tu acceso en este momento. Intenta nuevamente o contacta a IT.",
      };
    }

    if (!fallbackData) {
      return {
        allowed: false,
        user,
        reason: "unauthorized",
        message:
          "Tu cuenta no tiene acceso al Cotizador Walmart Connect. Si necesitas acceso, contacta a IT.",
      };
    }

    return { allowed: true, user, permissions: { canUseTarifario: false } };
  }

  if (error) {
    console.error("No se pudo validar el acceso al Cotizador Walmart Connect:", error);
    return {
      allowed: false,
      user,
      reason: "verification_error",
      message: "No se pudo validar tu acceso en este momento. Intenta nuevamente o contacta a IT.",
    };
  }

  if (!data || data.is_active !== true) {
    return {
      allowed: false,
      user,
      reason: "unauthorized",
      message:
        "Tu cuenta no tiene acceso al Cotizador Walmart Connect. Si necesitas acceso, contacta a IT.",
    };
  }

  return {
    allowed: true,
    user,
    permissions: { canUseTarifario: data.can_use_tarifario === true },
  };
}

export async function closeUnauthorizedSession(supabase: SupabaseClient) {
  const { error } = await supabase.auth.signOut({ scope: "local" });
  if (error) console.error("No se pudo cerrar la sesión no autorizada:", error);
}

const ACCESS_ERROR_KEY = "cotizador_wmc_access_error";

export function rememberAccessError(message: string) {
  if (typeof window === "undefined") return;
  window.sessionStorage.setItem(ACCESS_ERROR_KEY, message);
}

export function consumeAccessError() {
  if (typeof window === "undefined") return "";
  const message = window.sessionStorage.getItem(ACCESS_ERROR_KEY) ?? "";
  window.sessionStorage.removeItem(ACCESS_ERROR_KEY);
  return message;
}
