import { z } from "zod";
import { createRouter, publicQuery } from "../middleware";
import { getDb } from "../queries/connection";
import { wishlists, products } from "@db/schema";
import { eq, and } from "drizzle-orm";

function getSessionId(headers: Headers): string {
  return headers.get("x-session-id") || `sess_${Date.now()}`;
}

export const wishlistRouter = createRouter({
  get: publicQuery.query(async ({ ctx }) => {
    const db = getDb();
    const sessionId = getSessionId(ctx.req.headers);
    const items = await db
      .select({
        wishlistId: wishlists.id,
        productId: wishlists.productId,
        name: products.name,
        slug: products.slug,
        image: products.image,
        price: products.price,
        originalPrice: products.originalPrice,
        badge: products.badge,
        category: products.category,
      })
      .from(wishlists)
      .leftJoin(products, eq(wishlists.productId, products.id))
      .where(eq(wishlists.sessionId, sessionId));
    return items;
  }),

  add: publicQuery
    .input(z.object({ productId: z.number() }))
    .mutation(async ({ ctx, input }) => {
      const db = getDb();
      const sessionId = getSessionId(ctx.req.headers);
      const [existing] = await db
        .select()
        .from(wishlists)
        .where(and(eq(wishlists.sessionId, sessionId), eq(wishlists.productId, input.productId)))
        .limit(1);
      if (!existing) {
        await db.insert(wishlists).values({ sessionId, productId: input.productId });
      }
      return { success: true };
    }),

  remove: publicQuery
    .input(z.object({ wishlistId: z.number() }))
    .mutation(async ({ input }) => {
      const db = getDb();
      await db.delete(wishlists).where(eq(wishlists.id, input.wishlistId));
      return { success: true };
    }),

  toggle: publicQuery
    .input(z.object({ productId: z.number() }))
    .mutation(async ({ ctx, input }) => {
      const db = getDb();
      const sessionId = getSessionId(ctx.req.headers);
      const [existing] = await db
        .select()
        .from(wishlists)
        .where(and(eq(wishlists.sessionId, sessionId), eq(wishlists.productId, input.productId)))
        .limit(1);
      if (existing) {
        await db.delete(wishlists).where(eq(wishlists.id, existing.id));
        return { success: true, added: false };
      }
      await db.insert(wishlists).values({ sessionId, productId: input.productId });
      return { success: true, added: true };
    }),

  isInWishlist: publicQuery
    .input(z.object({ productId: z.number() }))
    .query(async ({ ctx, input }) => {
      const db = getDb();
      const sessionId = getSessionId(ctx.req.headers);
      const [existing] = await db
        .select()
        .from(wishlists)
        .where(and(eq(wishlists.sessionId, sessionId), eq(wishlists.productId, input.productId)))
        .limit(1);
      return { inWishlist: !!existing };
    }),
});
