import { AudienceCriteria } from '../types' /** * Parser centralizado para normalizar diferentes formatos de critérios */ export class CriteriaParser { /** * Parse e normaliza critérios para formato padrão */ static parse(criteria: string | AudienceCriteria): AudienceCriteria { let parsed: AudienceCriteria if (typeof criteria === 'string') { try { parsed = JSON.parse(criteria) } catch (error) { throw new Error('Critérios inválidos') } } else { parsed = criteria } return this.normalizeCriteria(parsed) } /** * Normaliza diferentes formatos de critérios para um formato único */ private static normalizeCriteria(criteria: AudienceCriteria): AudienceCriteria { if (criteria.filters && Array.isArray(criteria.filters)) { return { ...criteria, conditions: criteria.filters.map(filter => ({ groupId: filter.id, operator: filter.operator as 'AND' | 'OR', conditions: filter.conditions.map(cond => ({ field: cond.field, operator: cond.operator, value: cond.value, customFieldKey: cond.customFieldKey, logicalOperator: cond.logicalOperator as 'AND' | 'OR' | undefined })) })) } } if (criteria.groups) { return criteria } return criteria } /** * Detecta o tipo de audiência */ static getAudienceType(criteria: AudienceCriteria): 'static' | 'live' { const liveTypes = ['live-actions', 'live-page-visit', 'live-referrer', 'live-page-count'] return liveTypes.includes(criteria.type || '') ? 'live' : 'static' } /** * Valida se os critérios são válidos */ static validate(criteria: AudienceCriteria): { valid: boolean; errors: string[] } { const errors: string[] = [] if (!criteria || typeof criteria !== 'object') { errors.push('Critérios devem ser um objeto') return { valid: false, errors } } const hasConditions = criteria.conditions && Array.isArray(criteria.conditions) const hasFilters = criteria.filters && Array.isArray(criteria.filters) const hasGroups = criteria.groups && Array.isArray(criteria.groups) if (!hasConditions && !hasFilters && !hasGroups) { errors.push('Critérios devem conter conditions, filters ou groups') } return { valid: errors.length === 0, errors } } }