import { useEffect, useState } from "react";
import type { Session, User } from "@supabase/supabase-js";
import { supabase } from "@/integrations/supabase/client";
import type { Database } from "@/integrations/supabase/types";

export type CompanyRole = Database["public"]["Enums"]["company_role"];
export type Membership = { company_id: string; role: CompanyRole };
export type Portal = "admin" | "provider" | "customer";

export function useAuth() {
  const [session, setSession] = useState<Session | null>(null);
  const [loading, setLoading] = useState(true);
  const [isAdmin, setIsAdmin] = useState(false);
  const [memberships, setMemberships] = useState<Membership[]>([]);
  const [rolesLoading, setRolesLoading] = useState(true);

  useEffect(() => {
    const { data: sub } = supabase.auth.onAuthStateChange((_event, next) => {
      setSession(next);
    });
    supabase.auth.getSession().then(({ data }) => {
      setSession(data.session);
      setLoading(false);
    });
    return () => sub.subscription.unsubscribe();
  }, []);

  useEffect(() => {
    let active = true;
    const uid = session?.user?.id;
    if (!uid) {
      setIsAdmin(false);
      setMemberships([]);
      setRolesLoading(false);
      return;
    }
    setRolesLoading(true);
    Promise.all([
      supabase.from("user_roles").select("role").eq("user_id", uid).eq("role", "admin").maybeSingle(),
      supabase.from("company_members").select("company_id,role").eq("user_id", uid).eq("active", true),
    ]).then(([roleRes, memberRes]) => {
      if (!active) return;
      setIsAdmin(Boolean(roleRes.data));
      setMemberships((memberRes.data as Membership[] | null) ?? []);
      setRolesLoading(false);
    });
    return () => {
      active = false;
    };
  }, [session?.user?.id]);

  const user: User | null = session?.user ?? null;
  const membership = memberships[0] ?? null;
  const portal: Portal = isAdmin ? "admin" : membership ? "provider" : "customer";
  return {
    session,
    user,
    loading: loading || (Boolean(session) && rolesLoading),
    isAdmin,
    memberships,
    membership,
    companyId: membership?.company_id ?? null,
    companyRole: membership?.role ?? null,
    isProvider: memberships.length > 0,
    isCompanyAdmin: memberships.some((m) => m.role === "company_admin"),
    portal,
    portalHome: portal === "admin" ? "/admin" : portal === "provider" ? "/provider" : "/dashboard",
  };
}