import { sql } from 'drizzle-orm';
import type { TxDrizzleClient } from '../../client';
import { adminActions, outbox } from '../../schema';
import type { VendorViolationVerdict } from '@/server/ai/kinds/vendor-violation.js';

function returnedRows(result: unknown): unknown[] {
  if (Array.isArray(result)) return result;
  return (result as { rows?: unknown[] }).rows ?? [];
}

async function transitionPendingVendor(
  db: TxDrizzleClient,
  vendorId: string,
  update: ReturnType<typeof sql>,
): Promise<boolean> {
  const result = await db.execute(
    sql`UPDATE vendors SET ${update} WHERE id = ${vendorId} AND account_state = 'PENDING_FIRST_APPROVAL' AND llm_decision IS NULL RETURNING id`,
  );
  return returnedRows(result).length > 0;
}

export async function applyVerdict(
  db: TxDrizzleClient,
  vendorId: string,
  result: VendorViolationVerdict,
): Promise<{ applied: boolean }> {
  if (result.decision === 'APPROVE') {
    const claimed = await transitionPendingVendor(
      db,
      vendorId,
      sql`account_state = 'PENDING_PROCESSOR', llm_decision = 'APPROVE', flag_reason = NULL, reject_reason = NULL`,
    );
    if (!claimed) return { applied: false };

    await db.insert(adminActions).values({
      adminId: null,
      action: 'APPROVE',
      targetType: 'VENDOR',
      targetId: vendorId,
      note: `AI_AGENT approved vendor admission: ${result.rationale}`,
    });
    await db.insert(outbox).values({
      aggregateType: 'vendor',
      aggregateId: vendorId,
      eventType: 'vendor.approved',
      payload: { vendorId, rationale: result.rationale },
    });
  } else if (result.decision === 'FLAG') {
    const claimed = await transitionPendingVendor(
      db,
      vendorId,
      sql`llm_decision = 'FLAG', flag_reason = ${result.rationale}`,
    );
    if (!claimed) return { applied: false };

    await db.insert(outbox).values({
      aggregateType: 'vendor',
      aggregateId: vendorId,
      eventType: 'vendor.flagged',
      payload: { vendorId, rationale: result.rationale },
    });
  } else {
    const claimed = await transitionPendingVendor(
      db,
      vendorId,
      sql`account_state = 'REJECTED', llm_decision = 'REJECT', reject_reason = ${result.rationale}`,
    );
    if (!claimed) return { applied: false };

    await db.insert(adminActions).values({
      adminId: null,
      action: 'REJECT',
      targetType: 'VENDOR',
      targetId: vendorId,
      note: `AI_AGENT rejected vendor admission: ${result.rationale}`,
    });
    await db.insert(outbox).values({
      aggregateType: 'vendor',
      aggregateId: vendorId,
      eventType: 'vendor.rejected',
      payload: { vendorId, rationale: result.rationale },
    });
  }
  return { applied: true };
}
