<?php
/**
 * Wally Monitor - Data Sanitizer
 *
 * Centraliza sanitização e validação de dados de relatórios.
 *
 * @package    WallyMonitor
 * @subpackage Includes
 * @since      1.1.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

class Wally_Sanitizer {

    /**
     * Sanitiza dados de relatório JSON recursivamente
     *
     * @param mixed $data Dados a serem sanitizados.
     * @return mixed Dados sanitizados.
     */
    /**
     * Keys whose values may contain HTML snippets (from axe-core nodes).
     * These receive wp_kses_post() instead of sanitize_text_field().
     *
     * @var string[]
     */
    private static $html_safe_keys = array(
        'html',
        'source',
        'failureSummary',
        'snippet',
    );

    public static function sanitize_report_data( $data, $key = '' ) {
        if ( is_array( $data ) ) {
            $sanitized = array();
            foreach ( $data as $k => $v ) {
                $sanitized[ $k ] = self::sanitize_report_data( $v, $k );
            }
            return $sanitized;
        }

        if ( is_string( $data ) ) {
            if ( filter_var( $data, FILTER_VALIDATE_URL ) ) {
                return esc_url_raw( $data );
            }
            // Preserve HTML in known snippet fields so violation context is kept.
            if ( in_array( $key, self::$html_safe_keys, true ) ) {
                return wp_kses_post( $data );
            }
            return sanitize_text_field( $data );
        }

        if ( is_numeric( $data ) ) {
            return $data;
        }

        if ( is_bool( $data ) || is_null( $data ) ) {
            return $data;
        }

        return '';
    }

    /**
     * Valida estrutura do relatório de acessibilidade
     *
     * @param array $report_data Dados do relatório.
     * @return true|WP_Error True se válido, WP_Error caso contrário.
     */
    public static function validate_report_structure( $report_data ) {
        if ( ! is_array( $report_data ) ) {
            return new WP_Error( 'invalid_format', __( 'Formato de relatório inválido.', 'wally-monitor' ) );
        }

        if ( ! isset( $report_data['summary'] ) || ! is_array( $report_data['summary'] ) ) {
            return new WP_Error( 'missing_summary', __( 'Resumo do relatório ausente.', 'wally-monitor' ) );
        }

        if ( ! isset( $report_data['violations'] ) || ! is_array( $report_data['violations'] ) ) {
            return new WP_Error( 'missing_violations', __( 'Violações do relatório ausentes.', 'wally-monitor' ) );
        }

        $required_summary_fields = array( 'totalProblems', 'score' );
        foreach ( $required_summary_fields as $field ) {
            if ( ! isset( $report_data['summary'][ $field ] ) ) {
                return new WP_Error(
                    'invalid_summary',
                    /* translators: %s: name of the missing required field */
                    sprintf( __( 'Campo obrigatório ausente no resumo: %s', 'wally-monitor' ), $field )
                );
            }
        }

        return true;
    }
}
