/**
 * Stub VendorViolationFlagAgent - Phase 2 default.
 *
 * Pure deterministic threshold logic - no ML model required.
 * Thresholds are conservative baselines; tune via config in future phases.
 *
 * Severity rules (highest matching threshold wins):
 *   high   - ≥3 unresolved complaints, OR avg rating < 2.0, OR ≥5 removed reviews
 *   medium - ≥2 unresolved complaints, OR avg rating < 3.0, OR ≥3 removed reviews,
 *            OR refund rate ≥ 0.20 (20%)
 *   low    - ≥1 unresolved complaint, OR avg rating < 3.5, OR ≥1 removed review,
 *            OR refund rate ≥ 0.10 (10%)
 *   none   - no signals triggered
 */

import type {
  VendorViolationFlagAgent,
  VendorViolationFlagInput,
  VendorViolationFlagResult,
} from '../types.js';

export class StubVendorViolationFlagAgent implements VendorViolationFlagAgent {
  async flag(input: VendorViolationFlagInput): Promise<VendorViolationFlagResult> {
    const { signals } = input;
    const reasons: string[] = [];

    // ── High severity checks ──────────────────────────────────────────────────
    let severity: VendorViolationFlagResult['severity'] = 'none';

    if (signals.unresolvedComplaints >= 3) {
      reasons.push(`${signals.unresolvedComplaints} unresolved complaints`);
      severity = 'high';
    }
    if (signals.avgRating < 2.0 && signals.daysSinceFirstSale > 0) {
      reasons.push(`average rating ${signals.avgRating.toFixed(1)} is critically low`);
      severity = 'high';
    }
    if (signals.removedReviews >= 5) {
      reasons.push(`${signals.removedReviews} reviews removed`);
      severity = 'high';
    }

    if (severity === 'high') {
      return { severity, reasons };
    }

    // ── Medium severity checks ────────────────────────────────────────────────
    if (signals.unresolvedComplaints >= 2) {
      reasons.push(`${signals.unresolvedComplaints} unresolved complaints`);
      severity = 'medium';
    }
    if (signals.avgRating < 3.0 && signals.daysSinceFirstSale > 0) {
      reasons.push(`average rating ${signals.avgRating.toFixed(1)} is below acceptable threshold`);
      severity = 'medium';
    }
    if (signals.removedReviews >= 3) {
      reasons.push(`${signals.removedReviews} reviews removed`);
      severity = 'medium';
    }
    if (signals.refundRate >= 0.2) {
      reasons.push(`refund rate ${(signals.refundRate * 100).toFixed(0)}% exceeds 20%`);
      severity = 'medium';
    }

    if (severity === 'medium') {
      return { severity, reasons };
    }

    // ── Low severity checks ───────────────────────────────────────────────────
    if (signals.unresolvedComplaints >= 1) {
      reasons.push(`${signals.unresolvedComplaints} unresolved complaint`);
      severity = 'low';
    }
    if (signals.avgRating < 3.5 && signals.daysSinceFirstSale > 0) {
      reasons.push(`average rating ${signals.avgRating.toFixed(1)} is below 3.5`);
      severity = 'low';
    }
    if (signals.removedReviews >= 1) {
      reasons.push(`${signals.removedReviews} review(s) removed`);
      severity = 'low';
    }
    if (signals.refundRate >= 0.1) {
      reasons.push(`refund rate ${(signals.refundRate * 100).toFixed(0)}% exceeds 10%`);
      severity = 'low';
    }

    return { severity, reasons };
  }
}
