// Interface flexível para suportar múltiplos formatos de critérios de audience export interface AudienceCriteria { type?: string; conditions?: Array<{ groupId?: string; operator?: 'AND' | 'OR'; conditions?: Array<{ field: string; operator: string; value: any; value2?: any; customFieldKey?: string; logicalOperator?: 'AND' | 'OR'; timeValue?: any; timeUnit?: string; dateFrom?: string; dateTo?: string; }>; }>; groups?: Array<{ id?: string; operator?: 'AND' | 'OR' | 'NOT'; combineOperator?: 'AND' | 'OR' | 'NOT'; rules?: Array<{ kind?: 'event' | 'property' | string; field?: string; op?: string; value?: any; value2?: any; eventName?: string; negate?: boolean; time?: { unit?: 'minutes' | 'hours' | 'days' | 'weeks' | 'months'; value?: number; from?: string; to?: string; }; frequency?: { op: '>=' | '>' | '=' | '<=' | '<'; value: number; type?: 'count' | 'sum' | 'avg'; field?: string; }; attributes?: Array<{ key: string; op?: 'equals' | 'not_equals' | 'starts_with' | 'ends_with' | 'contains'; value: any; }>; timeValue?: any; timeUnit?: string; unit?: string; }>; }>; filters?: Array<{ id: string; operator: string; conditions: Array<{ id: string; field: string; value: string; value2?: any; operator: string; logicalOperator: string; customFieldKey?: string; timeValue?: any; timeUnit?: string; dateFrom?: string; dateTo?: string; }>; }>; segmentType?: string; config?: { name?: string; type?: string; pageUrl?: string; isActive?: boolean; eventType?: string; pageCount?: string; timeFrame?: string; conditions?: any[]; description?: string; referrerUrl?: string; behaviorCriteria?: { engaged?: boolean; purchased?: boolean; visitedPages?: boolean; }; }; live_options?: { include_past_behavior?: boolean; window_days?: number; [key: string]: any; }; isActive?: boolean; [key: string]: any; } export interface AudienceQueryOptions { organizationId: string projectId: string pagination?: { page?: number limit?: number } includeCount?: boolean } export interface AudienceExecutionResult { contactIds: Set contacts?: any[] count: number metadata?: { executionTime: number criteriaType: string cacheHit?: boolean } } export interface AudienceBuilderConfig { enableCache?: boolean cacheTimeout?: number enableDebugLogs?: boolean /** * Quando fornecido, o audience-module passa a executar o engine V2 internamente via Supabase, * sem depender de repositórios do reachy-api. */ supabaseClient?: any /** * Quando fornecido, o engine V2 usa ClickHouse para avaliar rules de evento (kind='event') * em vez do Supabase — elimina N queries paginadas + JS aggregation. * Requer AUDIENCE_EVENTS_BACKEND=clickhouse na aplicação que instancia o módulo. */ clickhouseClient?: any } export interface CreateAudienceData { name: string; description?: string; criteria: AudienceCriteria; organization_id: string; project_id: string; user_id: string; } export interface UpdateAudienceData { name?: string; description?: string; criteria?: AudienceCriteria; }