import { eq } from 'drizzle-orm';
import { formatAgorotPlain, formatAgorotShekels } from '@/lib/money.js';
import { deals, order, orderLine, dealSkus } from '@/server/db/schema';
import { lineRedemptionStatusSql } from '@/server/fulfillment/voucher-line-state.js';
import type { KnowledgeAdapter, KnowledgeChunk } from './types';
import type { AdapterContext } from '@/server/support/types';
import { resolvePurchaseId } from './_resolve';

const LABEL = 'הקשר רכישה';

export const orderContextAdapter: KnowledgeAdapter = {
  id: 'order-context',
  label: LABEL,
  description: 'פרטי הרכישה המקושרת לפנייה',
  async fetch(ctx: AdapterContext): Promise<KnowledgeChunk> {
    const base: KnowledgeChunk = {
      adapterId: 'order-context',
      label: LABEL,
      data: {},
      summary: '',
    };

    try {
      const purchaseId = await resolvePurchaseId(ctx);
      if (!purchaseId) {
        return { ...base, summary: 'אין רכישה מקושרת לפנייה' };
      }

      const [row] = await ctx.db
        .select({
          id: orderLine.id,
          lineTotal: orderLine.lineTotal,
          qty: orderLine.qty,
          orderStatus: order.status,
          createdAt: orderLine.createdAt,
          dealTitle: deals.title,
          dealId: deals.id,
          redemptionStatus: lineRedemptionStatusSql(orderLine.id),
        })
        .from(orderLine)
        .innerJoin(order, eq(orderLine.orderId, order.id))
        .innerJoin(dealSkus, eq(orderLine.variantId, dealSkus.id))
        .innerJoin(deals, eq(dealSkus.dealId, deals.id))
        .where(eq(orderLine.id, purchaseId))
        .limit(1);

      if (!row) {
        return { ...base, summary: 'רכישה מקושרת לא נמצאה' };
      }

      const amountAgorot = Number(row.lineTotal); // lineTotal stored in agorot
      const amountPaid = formatAgorotPlain(amountAgorot);
      const data = {
        purchaseId: row.id,
        dealId: row.dealId,
        dealTitle: row.dealTitle,
        quantity: row.qty,
        amountPaid,
        amountAgorot,
        paymentStatus: row.orderStatus,
        redemptionStatus: row.redemptionStatus ?? 'unredeemed',
        createdAt: row.createdAt.toISOString(),
      };

      return {
        ...base,
        data,
        summary: `רכישה ${row.dealTitle}: ${formatAgorotShekels(amountAgorot)}, כמות ${row.qty}, סטטוס ${row.orderStatus}`,
      };
    } catch (err) {
      return { ...base, error: String(err) };
    }
  },
};
