#!/usr/bin/env php
<?php
/**
 * CARE API - TESTE DE VALIDAÇÃO DOS ENDPOINTS
 * 
 * Este script valida especificamente os endpoints REST API
 * testando suas estruturas, métodos e contratos esperados.
 * 
 * @package Care_API\Tests
 */

define('CARE_API_TEST_MODE', true);

echo "🏥 CARE API - VALIDAÇÃO DOS ENDPOINTS\n";
echo "======================================\n\n";

/**
 * Classe para validação dos endpoints do Care API
 */
class CareAPIEndpointValidator {
    
    private $results = [];
    private $total_tests = 0;
    private $passed_tests = 0;
    private $failed_tests = 0;
    private $endpoints_dir;
    
    public function __construct() {
        $this->endpoints_dir = __DIR__ . '/src/includes/endpoints';
        echo "🔧 Inicializando validação dos endpoints...\n";
        echo "📁 Diretório: {$this->endpoints_dir}\n";
        echo "✅ Configuração concluída\n\n";
    }
    
    /**
     * Executar todos os testes de validação de endpoints
     */
    public function run_endpoint_validation() {
        echo "🚀 INICIANDO VALIDAÇÃO DOS ENDPOINTS\n";
        echo "====================================\n\n";
        
        // 1. VALIDAÇÃO DOS ENDPOINTS INDIVIDUAIS
        $this->validate_clinic_endpoints();
        $this->validate_patient_endpoints();
        $this->validate_doctor_endpoints();
        $this->validate_appointment_endpoints();
        $this->validate_encounter_endpoints();
        $this->validate_prescription_endpoints();
        $this->validate_bill_endpoints();
        
        // 2. VALIDAÇÃO DA ESTRUTURA GERAL
        $this->validate_endpoint_structure();
        
        // 3. VALIDAÇÃO DE SEGURANÇA
        $this->validate_security_features();
        
        // 4. VALIDAÇÃO DE PERFORMANCE
        $this->validate_performance_features();
        
        // Relatório final
        $this->generate_endpoint_report();
    }
    
    /**
     * Validar endpoints de Clínicas
     */
    private function validate_clinic_endpoints() {
        echo "🏥 1. VALIDAÇÃO - ENDPOINTS DE CLÍNICAS\n";
        echo "=======================================\n";
        
        $file = $this->endpoints_dir . '/class-clinic-endpoints.php';
        if (file_exists($file)) {
            $content = file_get_contents($file);
            
            // Testar estrutura básica
            $this->run_test('Clinics - Classe definida', function() use ($content) {
                return strpos($content, 'class') !== false && strpos($content, 'Clinic') !== false;
            });
            
            // Testar métodos CRUD esperados
            $crud_methods = ['get_clinics', 'get_clinic', 'create_clinic', 'update_clinic', 'delete_clinic'];
            foreach ($crud_methods as $method) {
                $this->run_test("Clinics - Método $method", function() use ($content, $method) {
                    return strpos($content, $method) !== false;
                });
            }
            
            // Testar validação
            $this->run_test('Clinics - Validação de permissões', function() use ($content) {
                return strpos($content, 'permission') !== false || 
                       strpos($content, 'current_user_can') !== false ||
                       strpos($content, 'authorize') !== false;
            });
            
            // Testar sanitização
            $this->run_test('Clinics - Sanitização de dados', function() use ($content) {
                return strpos($content, 'sanitize') !== false || 
                       strpos($content, 'validate') !== false;
            });
            
            // Testar resposta REST
            $this->run_test('Clinics - Resposta REST', function() use ($content) {
                return strpos($content, 'WP_REST_Response') !== false || 
                       strpos($content, 'rest_ensure_response') !== false;
            });
            
        } else {
            $this->run_test('Clinics - Arquivo existe', function() { return false; });
        }
        
        echo "\n";
    }
    
    /**
     * Validar endpoints de Pacientes
     */
    private function validate_patient_endpoints() {
        echo "👤 2. VALIDAÇÃO - ENDPOINTS DE PACIENTES\n";
        echo "=========================================\n";
        
        $file = $this->endpoints_dir . '/class-patient-endpoints.php';
        if (file_exists($file)) {
            $content = file_get_contents($file);
            
            $this->run_test('Patients - Classe definida', function() use ($content) {
                return strpos($content, 'class') !== false && strpos($content, 'Patient') !== false;
            });
            
            // Métodos específicos de pacientes
            $patient_methods = ['get_patients', 'get_patient', 'create_patient', 'update_patient', 'get_patient_history'];
            foreach ($patient_methods as $method) {
                $this->run_test("Patients - Método $method", function() use ($content, $method) {
                    return strpos($content, $method) !== false;
                });
            }
            
            // Validação de dados médicos
            $this->run_test('Patients - Validação dados médicos', function() use ($content) {
                return strpos($content, 'medical') !== false || 
                       strpos($content, 'health') !== false ||
                       strpos($content, 'patient_id') !== false;
            });
            
            // Privacy e GDPR
            $this->run_test('Patients - Considerações de privacidade', function() use ($content) {
                return strpos($content, 'privacy') !== false || 
                       strpos($content, 'sensitive') !== false ||
                       strpos($content, 'authorize') !== false;
            });
            
        } else {
            $this->run_test('Patients - Arquivo existe', function() { return false; });
        }
        
        echo "\n";
    }
    
    /**
     * Validar endpoints de Médicos
     */
    private function validate_doctor_endpoints() {
        echo "👩‍⚕️ 3. VALIDAÇÃO - ENDPOINTS DE MÉDICOS\n";
        echo "=========================================\n";
        
        $file = $this->endpoints_dir . '/class-doctor-endpoints.php';
        if (file_exists($file)) {
            $content = file_get_contents($file);
            
            $this->run_test('Doctors - Classe definida', function() use ($content) {
                return strpos($content, 'class') !== false && strpos($content, 'Doctor') !== false;
            });
            
            // Métodos específicos de médicos
            $doctor_methods = ['get_doctors', 'get_doctor', 'get_doctor_schedule', 'get_doctor_patients', 'get_doctor_appointments'];
            foreach ($doctor_methods as $method) {
                $this->run_test("Doctors - Método $method", function() use ($content, $method) {
                    return strpos($content, $method) !== false;
                });
            }
            
            // Especialidades médicas
            $this->run_test('Doctors - Especialidades médicas', function() use ($content) {
                return strpos($content, 'speciality') !== false || 
                       strpos($content, 'specialty') !== false ||
                       strpos($content, 'qualification') !== false;
            });
            
        } else {
            $this->run_test('Doctors - Arquivo existe', function() { return false; });
        }
        
        echo "\n";
    }
    
    /**
     * Validar endpoints de Consultas/Appointments
     */
    private function validate_appointment_endpoints() {
        echo "📅 4. VALIDAÇÃO - ENDPOINTS DE CONSULTAS\n";
        echo "=========================================\n";
        
        $file = $this->endpoints_dir . '/class-appointment-endpoints.php';
        if (file_exists($file)) {
            $content = file_get_contents($file);
            
            $this->run_test('Appointments - Classe definida', function() use ($content) {
                return strpos($content, 'class') !== false && strpos($content, 'Appointment') !== false;
            });
            
            // Métodos de gestão de consultas
            $appointment_methods = ['get_appointments', 'create_appointment', 'update_appointment', 'cancel_appointment', 'reschedule_appointment'];
            foreach ($appointment_methods as $method) {
                $this->run_test("Appointments - Método $method", function() use ($content, $method) {
                    return strpos($content, $method) !== false;
                });
            }
            
            // Validação de horários
            $this->run_test('Appointments - Validação de horários', function() use ($content) {
                return strpos($content, 'time') !== false && 
                       (strpos($content, 'validate') !== false || strpos($content, 'schedule') !== false);
            });
            
            // Status de consultas
            $this->run_test('Appointments - Status de consultas', function() use ($content) {
                return strpos($content, 'status') !== false;
            });
            
        } else {
            $this->run_test('Appointments - Arquivo existe', function() { return false; });
        }
        
        echo "\n";
    }
    
    /**
     * Validar endpoints de Encontros/Encounters
     */
    private function validate_encounter_endpoints() {
        echo "🩺 5. VALIDAÇÃO - ENDPOINTS DE ENCONTROS\n";
        echo "=========================================\n";
        
        $file = $this->endpoints_dir . '/class-encounter-endpoints.php';
        if (file_exists($file)) {
            $content = file_get_contents($file);
            
            $this->run_test('Encounters - Classe definida', function() use ($content) {
                return strpos($content, 'class') !== false && strpos($content, 'Encounter') !== false;
            });
            
            // Métodos médicos específicos
            $encounter_methods = ['get_encounters', 'create_encounter', 'update_encounter', 'add_encounter_notes'];
            foreach ($encounter_methods as $method) {
                $this->run_test("Encounters - Método $method", function() use ($content, $method) {
                    return strpos($content, $method) !== false;
                });
            }
            
            // Dados médicos
            $this->run_test('Encounters - Dados médicos', function() use ($content) {
                return strpos($content, 'medical') !== false || 
                       strpos($content, 'diagnosis') !== false ||
                       strpos($content, 'symptoms') !== false;
            });
            
        } else {
            $this->run_test('Encounters - Arquivo existe', function() { return false; });
        }
        
        echo "\n";
    }
    
    /**
     * Validar endpoints de Prescrições
     */
    private function validate_prescription_endpoints() {
        echo "💊 6. VALIDAÇÃO - ENDPOINTS DE PRESCRIÇÕES\n";
        echo "===========================================\n";
        
        $file = $this->endpoints_dir . '/class-prescription-endpoints.php';
        if (file_exists($file)) {
            $content = file_get_contents($file);
            
            $this->run_test('Prescriptions - Classe definida', function() use ($content) {
                return strpos($content, 'class') !== false && strpos($content, 'Prescription') !== false;
            });
            
            // Métodos de prescrições
            $prescription_methods = ['get_prescriptions', 'create_prescription', 'update_prescription', 'get_prescription_history'];
            foreach ($prescription_methods as $method) {
                $this->run_test("Prescriptions - Método $method", function() use ($content, $method) {
                    return strpos($content, $method) !== false;
                });
            }
            
            // Dados farmacêuticos
            $this->run_test('Prescriptions - Dados farmacêuticos', function() use ($content) {
                return strpos($content, 'medicine') !== false || 
                       strpos($content, 'dosage') !== false ||
                       strpos($content, 'frequency') !== false;
            });
            
        } else {
            $this->run_test('Prescriptions - Arquivo existe', function() { return false; });
        }
        
        echo "\n";
    }
    
    /**
     * Validar endpoints de Faturas/Bills
     */
    private function validate_bill_endpoints() {
        echo "💰 7. VALIDAÇÃO - ENDPOINTS DE FATURAS\n";
        echo "=======================================\n";
        
        $file = $this->endpoints_dir . '/class-bill-endpoints.php';
        if (file_exists($file)) {
            $content = file_get_contents($file);
            
            $this->run_test('Bills - Classe definida', function() use ($content) {
                return strpos($content, 'class') !== false && strpos($content, 'Bill') !== false;
            });
            
            // Métodos de faturação
            $bill_methods = ['get_bills', 'create_bill', 'update_bill', 'process_payment', 'generate_invoice'];
            foreach ($bill_methods as $method) {
                $this->run_test("Bills - Método $method", function() use ($content, $method) {
                    return strpos($content, $method) !== false;
                });
            }
            
            // Dados financeiros
            $this->run_test('Bills - Dados financeiros', function() use ($content) {
                return strpos($content, 'amount') !== false || 
                       strpos($content, 'payment') !== false ||
                       strpos($content, 'invoice') !== false;
            });
            
        } else {
            $this->run_test('Bills - Arquivo existe', function() { return false; });
        }
        
        echo "\n";
    }
    
    /**
     * Validar estrutura geral dos endpoints
     */
    private function validate_endpoint_structure() {
        echo "🏗️  8. VALIDAÇÃO - ESTRUTURA GERAL\n";
        echo "===================================\n";
        
        // Verificar padrão de nomenclatura
        $endpoint_files = glob($this->endpoints_dir . '/*.php');
        
        $this->run_test('Nomenclatura padrão dos arquivos', function() use ($endpoint_files) {
            foreach ($endpoint_files as $file) {
                $filename = basename($file);
                if (!preg_match('/^class-[\w-]+-endpoints\.php$/', $filename)) {
                    return false;
                }
            }
            return true;
        });
        
        // Verificar se todos têm namespace ou estrutura similar
        $namespace_count = 0;
        $class_count = 0;
        
        foreach ($endpoint_files as $file) {
            $content = file_get_contents($file);
            if (strpos($content, 'namespace') !== false) $namespace_count++;
            if (strpos($content, 'class') !== false) $class_count++;
        }
        
        $this->run_test('Estrutura consistente de classes', function() use ($class_count, $endpoint_files) {
            return $class_count >= count($endpoint_files) * 0.8; // 80% dos arquivos têm classes
        });
        
        echo "\n";
    }
    
    /**
     * Validar recursos de segurança
     */
    private function validate_security_features() {
        echo "🔒 9. VALIDAÇÃO - RECURSOS DE SEGURANÇA\n";
        echo "========================================\n";
        
        $endpoint_files = glob($this->endpoints_dir . '/*.php');
        $security_features = [
            'authorization' => 0,
            'sanitization' => 0,
            'validation' => 0,
            'nonce_check' => 0
        ];
        
        foreach ($endpoint_files as $file) {
            $content = file_get_contents($file);
            
            if (strpos($content, 'current_user_can') !== false || 
                strpos($content, 'permission') !== false ||
                strpos($content, 'authorize') !== false) {
                $security_features['authorization']++;
            }
            
            if (strpos($content, 'sanitize') !== false) {
                $security_features['sanitization']++;
            }
            
            if (strpos($content, 'validate') !== false) {
                $security_features['validation']++;
            }
            
            if (strpos($content, 'nonce') !== false) {
                $security_features['nonce_check']++;
            }
        }
        
        $total_files = count($endpoint_files);
        
        foreach ($security_features as $feature => $count) {
            $this->run_test("Recurso $feature presente", function() use ($count, $total_files) {
                return $count >= ($total_files * 0.5); // 50% dos endpoints têm o recurso
            });
        }
        
        echo "\n";
    }
    
    /**
     * Validar recursos de performance
     */
    private function validate_performance_features() {
        echo "⚡ 10. VALIDAÇÃO - RECURSOS DE PERFORMANCE\n";
        echo "==========================================\n";
        
        $endpoint_files = glob($this->endpoints_dir . '/*.php');
        $performance_features = [
            'cache' => 0,
            'pagination' => 0,
            'query_optimization' => 0
        ];
        
        foreach ($endpoint_files as $file) {
            $content = file_get_contents($file);
            
            if (strpos($content, 'cache') !== false) {
                $performance_features['cache']++;
            }
            
            if (strpos($content, 'page') !== false && 
                (strpos($content, 'limit') !== false || strpos($content, 'offset') !== false)) {
                $performance_features['pagination']++;
            }
            
            if (strpos($content, 'prepare') !== false || 
                strpos($content, 'get_results') !== false) {
                $performance_features['query_optimization']++;
            }
        }
        
        $total_files = count($endpoint_files);
        
        foreach ($performance_features as $feature => $count) {
            $this->run_test("Performance - $feature implementado", function() use ($count, $total_files) {
                return $count >= ($total_files * 0.3); // 30% dos endpoints têm o recurso
            });
        }
        
        echo "\n";
    }
    
    /**
     * Executar um teste individual
     */
    private function run_test($name, $callback) {
        $this->total_tests++;
        
        try {
            $result = $callback();
            if ($result) {
                echo "✅ $name\n";
                $this->passed_tests++;
                $this->results[] = ['name' => $name, 'status' => 'PASS'];
            } else {
                echo "❌ $name\n";
                $this->failed_tests++;
                $this->results[] = ['name' => $name, 'status' => 'FAIL'];
            }
        } catch (Exception $e) {
            echo "💥 $name - ERROR: " . $e->getMessage() . "\n";
            $this->failed_tests++;
            $this->results[] = ['name' => $name, 'status' => 'ERROR', 'error' => $e->getMessage()];
        }
    }
    
    /**
     * Gerar relatório de validação dos endpoints
     */
    private function generate_endpoint_report() {
        echo "\n🎯 RELATÓRIO DE VALIDAÇÃO DOS ENDPOINTS\n";
        echo "========================================\n\n";
        
        echo "📊 ESTATÍSTICAS GERAIS:\n";
        echo "  Total de testes: {$this->total_tests}\n";
        echo "  Testes aprovados: {$this->passed_tests}\n";
        echo "  Testes reprovados: {$this->failed_tests}\n";
        
        $success_rate = round(($this->passed_tests / $this->total_tests) * 100, 2);
        echo "  Taxa de sucesso: {$success_rate}%\n\n";
        
        // Classificação por funcionalidade
        $categories = [
            'Clínicas' => 0, 'Pacientes' => 0, 'Médicos' => 0, 'Consultas' => 0,
            'Encontros' => 0, 'Prescrições' => 0, 'Faturas' => 0, 'Estrutura' => 0,
            'Segurança' => 0, 'Performance' => 0
        ];
        
        foreach ($this->results as $result) {
            foreach ($categories as $category => $count) {
                if (strpos($result['name'], $category) !== false || 
                    strpos($result['name'], strtolower($category)) !== false) {
                    if ($result['status'] === 'PASS') {
                        $categories[$category]++;
                    }
                    break;
                }
            }
        }
        
        echo "📈 PERFORMANCE POR CATEGORIA:\n";
        foreach ($categories as $category => $passed) {
            $icon = $passed >= 5 ? '🟢' : ($passed >= 3 ? '🟡' : '🔴');
            echo "  $icon $category: $passed testes aprovados\n";
        }
        echo "\n";
        
        if ($success_rate >= 90) {
            echo "🏆 EXCELENTE! Endpoints estão bem estruturados e prontos para uso.\n";
        } elseif ($success_rate >= 75) {
            echo "👍 BOM! Endpoints têm boa estrutura, pequenos ajustes necessários.\n";
        } elseif ($success_rate >= 60) {
            echo "⚠️  REGULAR! Endpoints precisam de melhorias importantes.\n";
        } else {
            echo "🚨 CRÍTICO! Endpoints precisam de refatoração significativa.\n";
        }
        
        echo "\n🔧 PRINCIPAIS RECOMENDAÇÕES:\n";
        
        $failed_count = array_count_values(array_column($this->results, 'status'))['FAIL'] ?? 0;
        
        if ($failed_count > 0) {
            echo "  1. 🔐 Implementar validação de segurança em todos os endpoints\n";
            echo "  2. 📊 Adicionar paginação nos endpoints de listagem\n";
            echo "  3. ⚡ Implementar cache para melhorar performance\n";
            echo "  4. 🧪 Criar testes unitários para cada endpoint\n";
            echo "  5. 📝 Documentar contratos de API (OpenAPI/Swagger)\n";
        } else {
            echo "  ✨ Endpoints estão bem estruturados!\n";
            echo "  📱 Próximo passo: Testes de integração com aplicações frontend\n";
        }
        
        echo "\n📋 ENDPOINTS ESPECÍFICOS PARA REVISÃO:\n";
        $failed_endpoints = [];
        foreach ($this->results as $result) {
            if ($result['status'] !== 'PASS') {
                $endpoint = explode(' - ', $result['name'])[0];
                $failed_endpoints[$endpoint] = ($failed_endpoints[$endpoint] ?? 0) + 1;
            }
        }
        
        if (empty($failed_endpoints)) {
            echo "  ✅ Todos os endpoints passaram na validação!\n";
        } else {
            foreach ($failed_endpoints as $endpoint => $count) {
                echo "  🔸 $endpoint: $count problemas encontrados\n";
            }
        }
        
        echo "\n📅 Validação executada em: " . date('Y-m-d H:i:s') . "\n";
        echo "🏥 Care API Endpoint Validator - Descomplicar®\n";
    }
}

// Executar validação dos endpoints
$endpoint_validator = new CareAPIEndpointValidator();
$endpoint_validator->run_endpoint_validation();