import { cookies } from "next/headers";
import { notFound, redirect } from "next/navigation";
import {
  DEMO_ACCESS_COOKIE,
  getSafeRedirectPath,
  hasValidDemoAccessCookie,
} from "@/lib/demo-auth";
import { getDemoAppConfig } from "@/lib/demo-content";
import type { CompanyMembership } from "@/lib/types";

export type AuthenticatedUser = {
  id: string;
  email: string | null;
};

type BaseAuthenticatedContext = {
  supabase: null;
  user: AuthenticatedUser;
  member: CompanyMembership | null;
  platformAdmin: boolean;
};

export type AppContext = BaseAuthenticatedContext & {
  member: CompanyMembership;
};

export type PlatformAdminContext = BaseAuthenticatedContext & {
  platformAdmin: true;
};

export type RouteAppContext = {
  supabase: null;
  user: AuthenticatedUser | null;
  member: CompanyMembership | null;
  platformAdmin: boolean;
};

export function normalizeEmail(email: string) {
  return email.trim().toLowerCase();
}

export { getSafeRedirectPath };

export function isAuthDisabled() {
  return false;
}

export function isAdminDevAutoLoginEnabled() {
  return false;
}

async function buildDemoMembership(): Promise<CompanyMembership> {
  const config = await getDemoAppConfig();

  return {
    id: "demo-member",
    companyId: "demo-client",
    clientId: "demo-client",
    email: config.demoUser.email,
    fullName: config.demoUser.fullName,
    role: "learner",
    status: "active",
    companyName: config.demoUser.companyLabel,
    companySlug: "client-demo",
    clientName: config.demoUser.companyLabel,
    clientSlug: "client-demo",
  };
}

export async function hasDemoAccess() {
  const cookieStore = await cookies();

  return hasValidDemoAccessCookie(
    cookieStore.get(DEMO_ACCESS_COOKIE)?.value,
  );
}

export async function getRouteAppContext() {
  if (!(await hasDemoAccess())) {
    return {
      supabase: null,
      user: null,
      member: null,
      platformAdmin: false,
    } satisfies RouteAppContext;
  }

  const membership = await buildDemoMembership();

  return {
    supabase: null,
    user: {
      id: "demo-user",
      email: membership.email,
    },
    member: membership,
    platformAdmin: false,
  } satisfies RouteAppContext;
}

export async function requireAppContext() {
  const context = await getRouteAppContext();

  if (!context.user || !context.member || context.member.status !== "active") {
    redirect("/login");
  }

  return {
    ...context,
    user: context.user,
    member: context.member,
  } satisfies AppContext;
}

export async function requirePlatformAdminContext(): Promise<PlatformAdminContext> {
  notFound();
}

export async function requireAdminPlatformContext(): Promise<PlatformAdminContext> {
  notFound();
}

export async function getAdminRouteAppContext() {
  return {
    supabase: null,
    user: null,
    member: null,
    platformAdmin: false,
  } satisfies RouteAppContext;
}
