import { createDbService } from '@/server/services/db.js';
import { z } from 'zod';
import { getSystemConfig } from '../../../db/queries/system-config.js';
import { requireConfiguredLlmModel } from '../../../ai/model-config.js';
import { approveVendorHeroPending, rejectVendorHeroPending } from '../../../db/queries/vendors.js';
import type { OutboxHandler } from '../types.js';

const payloadSchema = z.object({
  vendorId: z.string(),
  r2Key: z.string().optional(),
  imageUrl: z.string().optional(),
});

type Payload = z.infer<typeof payloadSchema>;

export const vendorHeroReview: OutboxHandler<Payload> = {
  type: 'vendor.hero.review',
  payloadSchema,
  async handle(ctx, payload, event) {
    if (!ctx.GOOGLE_API_KEY) {
      console.warn(
        JSON.stringify({
          event: 'vendor.hero.review_skipped',
          reason: 'GOOGLE_API_KEY not configured',
          outboxId: event.id,
        }),
      );
      return;
    }

    const imageUrl = payload.imageUrl ?? '';
    const db = createDbService({ DATABASE_URL: ctx.DATABASE_URL });

    const { GeminiImageApprovalAgent } = await import('../../../ai/agents/image-approval.js');
    const { geminiProvider } = await import('../../../ai/providers/gemini.js');
    const model = requireConfiguredLlmModel(
      await getSystemConfig(db, 'llm_model'),
      'vendor hero review',
    );
    const agent = new GeminiImageApprovalAgent(
      geminiProvider,
      { apiKey: ctx.GOOGLE_API_KEY },
      model,
    );
    const result = await agent.reviewVendorHeroImage(imageUrl);

    if (result.decision === 'APPROVED') {
      await approveVendorHeroPending(db, payload.vendorId);
    } else if (result.decision === 'REJECTED' && result.rejectReasonCode) {
      await rejectVendorHeroPending(db, payload.vendorId, result.rejectReasonCode);
    }
    // NEEDS_REVIEW: leave PENDING — admin queue picks up
  },
};
