import type { Business } from "@/lib/types";
import { getDemoBusiness } from "@/lib/demo-profiles";
import { attachDemoDigitalPresence } from "@/lib/demo-digital-presence";
import { analyzeWebsiteAesthetics } from "@/lib/website-aesthetic-analysis";
import { analyzeSocialMedia } from "@/lib/social-media-analysis";
import { enrichBusinessWithRoles, isRoleIntelligenceComplete } from "@/lib/role-intelligence";
import { enrichUserRole } from "@/lib/user-workplace-role";
import { createBrowserClient } from "@/lib/supabase/client";

const LOCAL_KEY = "brandlxft-mvp";
const DEMO_ID_KEY = "brandlxft-demo-id";
const TABLE_NAME = "business_profiles";

function hasSupabaseEnv() {
  return Boolean(
    process.env.NEXT_PUBLIC_SUPABASE_URL && process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
  );
}

export function isDemoMode() {
  return !hasSupabaseEnv();
}

export function getActiveDemoId(): string | null {
  if (typeof window === "undefined") return null;
  return window.localStorage.getItem(DEMO_ID_KEY);
}

export async function loadDemoProfile(demoId: string): Promise<Business | null> {
  const raw = getDemoBusiness(demoId);
  if (!raw) return null;
  const { roleIntelligence: _stale, ...fresh } = raw;
  const business = enrichUserRole(enrichBusinessWithRoles({ ...fresh, roleIntelligence: undefined }));
  const withPresence = attachDemoDigitalPresence(business, demoId);
  const withAnalysis = {
    ...withPresence,
    websiteAestheticAnalysis: analyzeWebsiteAesthetics(withPresence),
    socialMediaAnalysis: analyzeSocialMedia(withPresence),
  };

  if (typeof window !== "undefined") {
    window.localStorage.setItem(LOCAL_KEY, JSON.stringify(withAnalysis));
    window.localStorage.setItem(DEMO_ID_KEY, demoId);
  }
  return withAnalysis;
}

export async function clearBusiness() {
  if (typeof window !== "undefined") {
    window.localStorage.removeItem(LOCAL_KEY);
    window.localStorage.removeItem(DEMO_ID_KEY);
  }
}

export async function getBusiness(userId?: string): Promise<Business | null> {
  if (typeof window !== "undefined") {
    if (isDemoMode()) {
      const raw = window.localStorage.getItem(LOCAL_KEY);
      if (!raw) return null;
      const parsed = JSON.parse(raw) as Business;
      let enriched = enrichUserRole(enrichBusinessWithRoles(parsed));
      const demoId = window.localStorage.getItem(DEMO_ID_KEY);
      if (demoId && !parsed.digitalPresence) {
        enriched = attachDemoDigitalPresence(enriched, demoId);
        window.localStorage.setItem(LOCAL_KEY, JSON.stringify(enriched));
      }
      if (!parsed.websiteAestheticAnalysis && enriched.input.websiteUrl?.trim()) {
        enriched = {
          ...enriched,
          websiteAestheticAnalysis: analyzeWebsiteAesthetics(enriched),
        };
        window.localStorage.setItem(LOCAL_KEY, JSON.stringify(enriched));
      }
      if (!parsed.socialMediaAnalysis) {
        enriched = {
          ...enriched,
          socialMediaAnalysis: analyzeSocialMedia(enriched),
        };
        window.localStorage.setItem(LOCAL_KEY, JSON.stringify(enriched));
      } else if (
        !isRoleIntelligenceComplete(parsed.roleIntelligence) &&
        isRoleIntelligenceComplete(enriched.roleIntelligence)
      ) {
        window.localStorage.setItem(LOCAL_KEY, JSON.stringify(enriched));
      } else if (!parsed.userRole && enriched.userRole) {
        window.localStorage.setItem(LOCAL_KEY, JSON.stringify(enriched));
      }
      return enriched;
    }

    if (!userId) return null;
    try {
      const supabase = createBrowserClient();
      const { data, error } = await supabase
        .from(TABLE_NAME)
        .select("payload")
        .eq("user_id", userId)
        .single();
      if (error) return null;
      return (data?.payload as Business) ?? null;
    } catch {
      return null;
    }
  }

  // In server runtime this module intentionally behaves as read-through only.
  // Use client-side session context for persisted user records in MVP mode.
  return null;
}

export async function saveBusiness(business: Business, userId?: string) {
  if (typeof window !== "undefined") {
    if (isDemoMode()) {
      window.localStorage.setItem(LOCAL_KEY, JSON.stringify(business));
      return { ok: true, mode: "demo" as const };
    }

    if (!userId) return { ok: false, error: "Missing user id." };
    const supabase = createBrowserClient();
    const { error } = await supabase.from(TABLE_NAME).upsert(
      {
        user_id: userId,
        payload: business,
        updated_at: new Date().toISOString(),
      },
      { onConflict: "user_id" },
    );
    return { ok: !error, error: error?.message };
  }

  if (isDemoMode()) return { ok: true, mode: "demo" as const };
  if (!userId) return { ok: false, error: "Missing user id." };
  return { ok: false, error: "Server-side save is not available in this MVP path." };
}
