import { eq } from 'drizzle-orm';
import { deals, orderLine, dealSkus } from '@/server/db/schema';
import type { KnowledgeAdapter, KnowledgeChunk } from './types';
import type { AdapterContext } from '@/server/support/types';
import { loadDealSummary, resolveSupportContext } from './_resolve';

const LABEL = 'פרטי דיל';

export const dealInfoAdapter: KnowledgeAdapter = {
  id: 'deal-info',
  label: LABEL,
  description: 'מידע על הדיל הקשור לפנייה',
  async fetch(ctx: AdapterContext): Promise<KnowledgeChunk> {
    const base: KnowledgeChunk = {
      adapterId: 'deal-info',
      label: LABEL,
      data: {},
      summary: '',
    };

    try {
      const { dealId, purchaseId } = await resolveSupportContext(ctx);
      let resolvedDealId = dealId;

      if (!resolvedDealId && purchaseId) {
        const [lineRow] = await ctx.db
          .select({ dealId: dealSkus.dealId })
          .from(orderLine)
          .innerJoin(dealSkus, eq(orderLine.variantId, dealSkus.id))
          .where(eq(orderLine.id, purchaseId))
          .limit(1);
        resolvedDealId = lineRow?.dealId ?? null;
      }

      if (!resolvedDealId) {
        return { ...base, summary: 'אין דיל מקושר לפנייה' };
      }

      const [dealRow] = await ctx.db
        .select({
          id: deals.id,
          title: deals.title,
          description: deals.description,
          dealState: deals.dealState,
          commissionRate: deals.commissionRate,
          returnWindowDays: deals.returnWindowDays,
          isReturnable: deals.isReturnable,
          minPrice: deals.minPrice,
          maxPrice: deals.maxPrice,
        })
        .from(deals)
        .where(eq(deals.id, resolvedDealId))
        .limit(1);

      if (!dealRow) {
        return { ...base, summary: 'דיל לא נמצא' };
      }

      const vendorSummary = await loadDealSummary(ctx, resolvedDealId);
      const data = {
        ...dealRow,
        vendorName: vendorSummary?.vendorName ?? null,
        minPrice: dealRow.minPrice,
        maxPrice: dealRow.maxPrice,
      };

      const terms = `החזרה תוך ${dealRow.returnWindowDays} ימים${dealRow.isReturnable ? '' : ' (לא ניתן להחזרה)'}`;

      return {
        ...base,
        data,
        summary: `${dealRow.title} (${vendorSummary?.vendorName ?? 'ספק'}): ${terms}`,
      };
    } catch (err) {
      return { ...base, error: String(err) };
    }
  },
};
