<?php

namespace WPD\Diagnostics\Checks;

use WPD\Diagnostics\CheckInterface;
use WPD\Domain\CheckResult;
use WPD\Domain\Finding;
use WPD\Domain\ScanContext;

final class StructureCheck implements CheckInterface
{
    public function id()
    {
        return 'structure';
    }

    public function label()
    {
        return 'Estructura esencial';
    }

    public function run(ScanContext $context, array $cursor)
    {
        $requiredFiles = array('index.php', 'wp-load.php', 'wp-settings.php', 'wp-blog-header.php', 'wp-includes/version.php', 'wp-admin/index.php');
        $missing = array();
        $unreadable = array();
        foreach ($requiredFiles as $relative) {
            $path = $context->root() . '/' . $relative;
            if (!is_file($path)) {
                $missing[] = $relative;
            } elseif (!is_readable($path)) {
                $unreadable[] = $relative;
            }
        }

        $findings = array();
        if ($missing) {
            $findings[] = new Finding(
                'structure.missing_core_files',
                'Faltan archivos esenciales de WordPress',
                'problema confirmado',
                'crítica',
                'No se encontraron: ' . implode(', ', $missing) . '.',
                'WordPress no puede completar su arranque sin estos archivos.',
                array('Haz una copia completa de archivos y base de datos.', 'Descarga exactamente la misma versión de WordPress desde su fuente oficial.', 'Sustituye solo wp-admin, wp-includes y los archivos del núcleo; no reemplaces wp-content ni wp-config.php.'),
                'Vuelve a ejecutar el diagnóstico y confirma que los archivos ya aparecen.'
            );
        }
        if ($unreadable) {
            $findings[] = new Finding(
                'structure.unreadable_core_files',
                'PHP no puede leer archivos esenciales',
                'problema confirmado',
                'crítica',
                'Archivos sin lectura: ' . implode(', ', $unreadable) . '.',
                'Aunque existan, WordPress no puede cargarlos con los permisos actuales.',
                array('Anota los permisos actuales y realiza una copia de seguridad.', 'Corrige propietario y permisos desde el panel o consulta al alojamiento.', 'Evita aplicar permisos 777 de forma recursiva.'),
                'Repite el diagnóstico y comprueba que los archivos sean legibles.'
            );
        }

        $version = $context->wordpressVersion();
        $note = $version ? 'WordPress detectado: ' . $version . '.' : 'No se pudo determinar la versión de WordPress.';
        if ($version === null) {
            $findings[] = new Finding(
                'structure.unknown_version',
                'No se puede determinar la versión de WordPress',
                'advertencia',
                'media',
                'wp-includes/version.php no contiene un valor de versión reconocible.',
                'El archivo puede estar incompleto o alterado, y no se podrá comprobar la integridad exacta del núcleo.',
                array('Haz una copia de seguridad.', 'Compara wp-includes/version.php con una copia oficial.', 'No sustituyas wp-content ni wp-config.php.'),
                'Comprueba que la versión aparezca al repetir el análisis.',
                'parcial'
            );
        }
        return CheckResult::complete($findings, null, $note);
    }
}

