import { db } from "@/db";
import { adSlots, adNetworks } from "@/db/schema";
import { eq } from "drizzle-orm";
import { getSetting } from "@/lib/settings";
import { toBoolean } from "@/lib/utils";
import { AdSenseUnit } from "@/components/AdSenseUnit";

interface Props {
  position: string;
  className?: string;
}

export async function AdSlot({ position, className = "" }: Props) {
  const [slotRows, networkRows, adsenseEnabled, publisherId] = await Promise.all([
    db.select().from(adSlots).where(eq(adSlots.position, position)).limit(1),
    db.select().from(adNetworks).where(eq(adNetworks.status, "enabled")),
    getSetting("adsense_enabled"),
    getSetting("adsense_publisher_id"),
  ]);

  const slot = slotRows[0];
  if (!slot || !slot.enabled) return null;

  if (slot.provider === "adsense") {
    if (!toBoolean(adsenseEnabled) || !publisherId || !slot.adsenseSlotId) return null;
    return (
      <div className={className}>
        <AdSenseUnit client={publisherId} slot={slot.adsenseSlotId} />
      </div>
    );
  }

  if (slot.provider === "network" && slot.networkId) {
    const network = networkRows.find((n) => n.id === slot.networkId);
    if (!network) return null;
    return (
      <div className={className}>
        {network.desktopCode && (
          <div
            className="hidden md:block"
            dangerouslySetInnerHTML={{ __html: network.desktopCode }}
          />
        )}
        {network.mobileCode && (
          <div
            className="md:hidden"
            dangerouslySetInnerHTML={{ __html: network.mobileCode }}
          />
        )}
        {!network.desktopCode && !network.mobileCode && network.inContentCode && (
          <div dangerouslySetInnerHTML={{ __html: network.inContentCode }} />
        )}
      </div>
    );
  }

  return null;
}
