import { applyToCart, groupByVendor } from '@platform-modules/commerce-cart';
import {
  createDbCartStore,
  pushSchema,
  type CartSchema,
} from '@platform-modules/commerce-cart/store-db';
import type { Querier, TransactionalDatabase } from '@platform-modules/db';
import type { Cart, CartStore } from '@platform-modules/commerce-cart';
import { sql } from 'drizzle-orm';
import type { DrizzleClient, DrizzleDb } from '@/server/db/client';
import { asCartId, asUserId, asVendorId, toModuleRef } from '@/server/platform-seams/ids.js';

export function makeCartStore(db: DrizzleDb): CartStore {
  return createDbCartStore(db as unknown as TransactionalDatabase<CartSchema>);
}

export async function initCartSchema(db: DrizzleDb): Promise<void> {
  await pushSchema(db as unknown as TransactionalDatabase<CartSchema>);
}

export function toCartDb(db: DrizzleClient | DrizzleDb): Querier<CartSchema> {
  return db as unknown as TransactionalDatabase<CartSchema>;
}

export function toPriceSnapshot(
  discountedPrice: string,
  vendorId: string | null,
): { amount: bigint; currency: 'ILS'; priceMode: 'exclusive'; vendorId: string | null } {
  const vendorRef = vendorId === null ? null : toModuleRef(asVendorId(vendorId));
  return {
    amount: BigInt(Math.round(parseFloat(discountedPrice) * 100)),
    currency: 'ILS',
    priceMode: 'exclusive',
    vendorId: vendorRef,
  };
}

export async function getOrCreateCartForUser(db: DrizzleDb, userId: string): Promise<string> {
  const userRef = toModuleRef(asUserId(userId));
  const insertResult = await db.execute(sql`
    INSERT INTO cart (currency, user_id) VALUES ('ILS', ${userRef})
    ON CONFLICT (user_id) WHERE user_id IS NOT NULL DO NOTHING
    RETURNING id
  `);

  const insertedRow = insertResult.rows[0] as { id: string } | undefined;
  if (insertedRow?.id) {
    return toModuleRef(asCartId(String(insertedRow.id)));
  }

  const selectResult = await db.execute(sql`
    SELECT id FROM cart WHERE user_id = ${userRef} LIMIT 1
  `);

  return toModuleRef(asCartId(String((selectResult.rows[0] as { id: string }).id)));
}

export { applyToCart, groupByVendor };
export type { Cart };
