import { z } from 'zod';

export const FRAUD_DECISION_POINTS = ['signup', 'earn', 'withdraw'] as const;
export const FRAUD_ACTIONS = ['block', 'hold', 'flag'] as const;
export const RESOLVE_ACTIONS = ['release', 'reject_clawback', 'suspend', 'dismiss'] as const;

export const fraudEventsQuerySchema = z.object({
  decision_point: z.enum(FRAUD_DECISION_POINTS).optional(),
  action: z.enum(FRAUD_ACTIONS).optional(),
  adapter: z.string().max(64).optional(),
  status: z.enum(['unresolved', 'all']).default('unresolved'),
  from: z.coerce.date().optional(),
  to: z.coerce.date().optional(),
  group_by: z.enum(['adapter', 'decision_point', 'affiliate', 'flat']).default('flat'),
  limit: z.coerce.number().int().min(1).max(200).default(50),
  offset: z.coerce.number().int().min(0).default(0),
});

export const resolveEventBodySchema = z.discriminatedUnion('action', [
  z.object({
    action: z.literal('release'),
    reason: z.string().min(5).max(500),
  }),
  z.object({
    action: z.literal('reject_clawback'),
    reason: z.string().min(5).max(500),
    confirm_amount_agorot: z.number().int().nonnegative(),
  }),
  z.object({
    action: z.literal('suspend'),
    reason: z.string().min(5).max(500),
  }),
  z.object({
    action: z.literal('dismiss'),
    reason: z.string().min(5).max(500),
  }),
]);

export const fraudAnalyticsQuerySchema = z.object({
  widget: z.enum(['events_over_time', 'false_positive_rate', 'top_firing_adapters', 'money_protected']),
});

export type FraudEventsQuery = z.infer<typeof fraudEventsQuerySchema>;
export type ResolveEventBody = z.infer<typeof resolveEventBodySchema>;
export type FraudAnalyticsQuery = z.infer<typeof fraudAnalyticsQuerySchema>;
