<?php

declare(strict_types=1);

// Read-only reproduction of the two richness SELECT shapes. Outputs only
// pass/fail and error class/code, never SQL, dates, IDs, names, or result rows.
$pid=(string)getenv('POC_RUNTIME_PID');
if (!ctype_digit($pid)) {
    fwrite(STDERR,"Approved C PID required\n");
    exit(2);
}
try {
    $cmdline=(string)file_get_contents('/proc/'.$pid.'/cmdline');
    if (strpos($cmdline,'127.0.0.1:18080')===false
        || strpos($cmdline,
            '/tmp/zhct-dm-poc-20260928.fcpiiN/store/public')===false) {
        throw new RuntimeException('Unexpected C runtime');
    }
    $env=array_fill_keys(['POC_HOST','POC_PORT','POC_SCHEMA',
        'POC_USER','POC_PASSWORD'],'');
    foreach (explode("\0",(string)file_get_contents('/proc/'.$pid.'/environ')) as $entry) {
        $pair=explode('=',$entry,2);
        if (count($pair)===2 && array_key_exists($pair[0],$env)) {
            $env[$pair[0]]=$pair[1];
        }
    }
    if ($env['POC_HOST']!=='127.0.0.1' || $env['POC_PORT']!=='5237'
        || strtoupper($env['POC_SCHEMA'])!=='ZHCT_APP'
        || strtoupper($env['POC_USER'])!=='ZHCT_APP'
        || $env['POC_PASSWORD']==='') {
        throw new RuntimeException('Unexpected C database');
    }
    $db=new PDO('dm:host=127.0.0.1;port=5237;schema=ZHCT_APP',
        $env['POC_USER'],$env['POC_PASSWORD'],[
            PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC,
        ]);
    if (strtoupper((string)$db->query(
        "SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")
        ->fetchColumn())!=='ZHCT_APP') {
        throw new RuntimeException('Wrong current schema');
    }
    $validSort='1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,'
        .'21,22,23,24,25,26,27,28,29,34,35,36';
    $contextSql='SELECT DISTINCT d.UUID D_UUID,r.MENU_DATE R_DATE,'
        .' r.RESTAURANT_ID R_ID FROM YDY_DISHES d'
        .' JOIN YDY_DISH c ON c.DISHES_UUID=d.UUID'
        .' JOIN YDY_FOODS_COMPOSITION f ON f.ID=c.COMPOSITION_ID'
        .' JOIN YDY_RECIPES r ON r.DISHES_UUID=d.UUID'
        .' WHERE d.STATUS=1 AND d.IS_DEL=1 AND d.IS_DELETE=0'
        .' AND d.STORE_ID=10001 AND d.WEIGHT>0 AND d.ENERGY>0'
        .' AND d.CATEGORY BETWEEN 1 AND 6 AND c.IS_DELETE=0'
        .' AND f.IS_DELETE=0 AND c.MINUTE_SORT IN ('.$validSort.')'
        .' AND r.MEAL_TIMES=1 AND EXISTS(SELECT 1 FROM YDY_DATE_MENU dm'
        .' WHERE dm.DISHES_UUID=r.DISHES_UUID'
        .' AND dm.MENU_DATE=r.MENU_DATE'
        .' AND dm.RESTAURANT_ID=r.RESTAURANT_ID'
        .' AND dm.MEAL_TIMES=1 AND dm.MEAL_TYPE=3)';
    $rows=$db->query($contextSql)->fetchAll(PDO::FETCH_ASSOC);
    $day=null;
    $restaurantId=0;
    $matches=0;
    foreach ($rows as $row) {
        $uuid=(string)($row['D_UUID']??$row['d_uuid']??'');
        $candidateDay=substr((string)($row['R_DATE']??$row['r_date']??''),0,10);
        if (substr(hash('sha256',$uuid),0,12)!=='2a23c2721fd0'
            || substr(hash('sha256',$candidateDay),0,12)!=='fee7778c69b6') {
            continue;
        }
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/',$candidateDay)) {
            throw new RuntimeException('Selected date invalid');
        }
        $day=$candidateDay;
        $restaurantId=(int)($row['R_ID']??$row['r_id']??0);
        $matches++;
    }
    if ($day===null || $restaurantId<=0 || $matches!==1) {
        throw new RuntimeException('Original anonymous context absent or ambiguous');
    }
    $base='SELECT *,COUNT(a.CATEGORY) AS NUMBER FROM ('
        .' SELECT b.*,c.CATEGORY FROM YDY_RECIPES b'
        .' LEFT JOIN YDY_DISHES c ON b.DISHES_UUID=c.UUID'
        ." WHERE b.MENU_DATE BETWEEN '".$day."' AND '".$day."'"
        .' AND b.RESTAURANT_ID='.$restaurantId
        .' AND b.MEAL_TIMES=1 AND c.IS_DEL=1 AND c.STATUS=1'
        .' GROUP BY b.DISHES_UUID,b.MENU_DATE'
        .' ORDER BY c.CATEGORY DESC) a GROUP BY a.CATEGORY';
    $result=['context_matched'=>true,'queries'=>[]];
    foreach (['by_category_day'=>$base.',a.MENU_DATE',
        'by_category'=>$base] as $label=>$sql) {
        try {
            $stmt=$db->query($sql);
            $stmt->fetchAll(PDO::FETCH_ASSOC);
            $result['queries'][$label]=['status'=>'pass'];
        } catch (Throwable $error) {
            $message=$error->getMessage();
            preg_match('/General error:\s*(-?\d+)/',$message,$match);
            $result['queries'][$label]=[
                'status'=>'fail',
                'class'=>get_class($error),
                'sqlstate_or_code'=>(string)$error->getCode(),
                'db_error_code'=>$match[1]??null,
                'mentions_group_by'=>(bool)preg_match('/group|分组/i',$message),
                'mentions_invalid_column'=>(bool)preg_match('/invalid column|无效的列名/i',$message),
                'mentions_syntax'=>(bool)preg_match('/syntax|语法/i',$message),
            ];
        }
    }
    // Test the production-style ThinkPHP connection and Db::query($sql,$bind),
    // not just a literal SQL query through raw PDO.
    $root='/tmp/zhct-dm-poc-20260928.fcpiiN/store';
    if (!defined('APP_PATH')) define('APP_PATH',$root.'/application/');
    require_once $root.'/thinkphp/base.php';
    require_once $root.'/application/cores/database/Dm.php';
    $config=[
        'type'=>\app\cores\database\Dm::class,
        'hostname'=>$env['POC_HOST'],
        'hostport'=>(int)$env['POC_PORT'],
        'database'=>$env['POC_SCHEMA'],
        'username'=>$env['POC_USER'],
        'password'=>$env['POC_PASSWORD'],
        'prefix'=>'ydy_',
        'debug'=>false,
        'params'=>[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC],
    ];
    $connection=\think\Db::connect($config,true);
    $boundBase='SELECT *,COUNT(a.CATEGORY) AS NUMBER FROM ('
        .' SELECT b.*,c.CATEGORY FROM YDY_RECIPES b'
        .' LEFT JOIN YDY_DISHES c ON b.DISHES_UUID=c.UUID'
        .' WHERE b.MENU_DATE BETWEEN ? AND ?'
        .' AND b.RESTAURANT_ID=? AND b.MEAL_TIMES=?'
        .' AND c.IS_DEL=1 AND c.STATUS=1'
        .' GROUP BY b.DISHES_UUID,b.MENU_DATE'
        .' ORDER BY c.CATEGORY DESC) a GROUP BY a.CATEGORY';
    $result['framework_bound']=[];
    foreach (['by_category_day'=>$boundBase.',a.MENU_DATE',
        'by_category'=>$boundBase] as $label=>$sql) {
        try {
            $connection->query($sql,[$day,$day,$restaurantId,1]);
            $result['framework_bound'][$label]=['status'=>'pass'];
        } catch (Throwable $error) {
            $message=$error->getMessage();
            preg_match('/General error:\s*(-?\d+)/',$message,$match);
            $result['framework_bound'][$label]=[
                'status'=>'fail',
                'class'=>get_class($error),
                'sqlstate_or_code'=>(string)$error->getCode(),
                'db_error_code'=>$match[1]??null,
                'mentions_group_by'=>(bool)preg_match('/group|分组/i',$message),
                'mentions_invalid_column'=>(bool)preg_match('/invalid column|无效的列名/i',$message),
                'mentions_syntax'=>(bool)preg_match('/syntax|语法/i',$message),
            ];
        }
    }
    echo json_encode($result,JSON_UNESCAPED_SLASHES).PHP_EOL;
} catch (Throwable $error) {
    echo json_encode(['status'=>'preflight_error',
        'class'=>get_class($error),'code'=>$error->getCode()]).PHP_EOL;
    exit(1);
}
