import { desc, eq } from 'drizzle-orm';
import { formatAgorotShekels } from '@/lib/money.js';
import { vendorPayoutReleases } from '@/server/db/schema';
import type { KnowledgeAdapter, KnowledgeChunk } from './types';
import type { AdapterContext } from '@/server/support/types';
import { resolveVendorId } from './_resolve';

const LABEL = 'תשלומי ספק';

export const vendorPayoutsAdapter: KnowledgeAdapter = {
  id: 'vendor-payouts',
  label: LABEL,
  description: 'שחרורי תשלום אחרונים לספק',
  async fetch(ctx: AdapterContext): Promise<KnowledgeChunk> {
    const base: KnowledgeChunk = {
      adapterId: 'vendor-payouts',
      label: LABEL,
      data: {},
      summary: '',
    };

    try {
      const vendorId = await resolveVendorId(ctx);
      if (!vendorId) {
        return { ...base, summary: 'אין ספק מקושר — אין נתוני תשלום' };
      }

      const rows = await ctx.db
        .select({
          id: vendorPayoutReleases.id,
          netAmountAgorot: vendorPayoutReleases.netAmountAgorot,
          status: vendorPayoutReleases.status,
          releaseAt: vendorPayoutReleases.releaseAt,
          releasedAt: vendorPayoutReleases.releasedAt,
          heldAt: vendorPayoutReleases.heldAt,
        })
        .from(vendorPayoutReleases)
        .where(eq(vendorPayoutReleases.vendorId, vendorId))
        .orderBy(desc(vendorPayoutReleases.heldAt))
        .limit(5);

      const pendingAgorot = rows
        .filter((r) => r.status === 'held' || r.status === 'enqueued' || r.status === 'releasing')
        .reduce((sum, r) => sum + r.netAmountAgorot, 0);

      const lastReleased = rows.find((r) => r.status === 'released');

      const payouts = rows.map((r) => ({
        id: r.id,
        netAmountAgorot: r.netAmountAgorot,
        status: r.status,
        releaseAt: r.releaseAt.toISOString(),
        releasedAt: r.releasedAt?.toISOString() ?? null,
      }));

      const summary =
        rows.length === 0
          ? 'אין שחרורי תשלום לספק'
          : `יתרה ממתינה ${formatAgorotShekels(pendingAgorot)}` +
            (lastReleased
              ? `, שחרור אחרון ${formatAgorotShekels(lastReleased.netAmountAgorot)}`
              : '');

      return {
        ...base,
        data: { pendingAgorot, payouts },
        summary,
      };
    } catch (err) {
      return { ...base, error: String(err) };
    }
  },
};
