<?php

declare(strict_types=1);

// SELECT-only ThinkPHP nutritionCalculation shape. No SQL/parameters/rows emitted.
$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');
    $root='/tmp/zhct-dm-poc-20260928.fcpiiN/store';
    if (strpos($cmdline,'127.0.0.1:18080')===false
        || strpos($cmdline,$root.'/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');
    }
    $pdo=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,
        ]);
    $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,d.NAME D_NAME,'
        .' 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=$pdo->query($contextSql)->fetchAll(PDO::FETCH_ASSOC);
    $matched=[];
    foreach ($rows as $row) {
        $uuid=(string)($row['D_UUID']??$row['d_uuid']??'');
        $day=substr((string)($row['R_DATE']??$row['r_date']??''),0,10);
        if (substr(hash('sha256',$uuid),0,12)==='2a23c2721fd0'
            && substr(hash('sha256',$day),0,12)==='fee7778c69b6') {
            $matched[]=['day'=>$day,'restaurant_id'=>(int)($row['R_ID']??$row['r_id']??0),
                'name'=>(string)($row['D_NAME']??$row['d_name']??'')];
        }
    }
    if (count($matched)!==1
        || !preg_match('/^\d{4}-\d{2}-\d{2}$/',$matched[0]['day'])
        || $matched[0]['restaurant_id']<=0 || $matched[0]['name']==='') {
        throw new RuntimeException('Original anonymous context absent or ambiguous');
    }
    $day=$matched[0]['day'];
    $restaurantId=$matched[0]['restaurant_id'];
    $targetName=$matched[0]['name'];
    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);
    $where="menu_date >= '".$day."' and menu_date <= '".$day."'"
        ." and restaurant_id = '".$restaurantId."'"
        .' and meal_times = 1 AND b.is_del = 1 AND b.status = 1';
    try {
        $rows=$connection->table('ydy_recipes')->alias('a')
            ->field('b.name,b.file_path,b.energy,b.weight')
            ->join('ydy_dishes b','a.dishes_uuid = b.uuid','RIGHT')
            ->group('b.name')->where($where)->select();
        if (is_object($rows) && method_exists($rows,'toArray')) {
            $rows=$rows->toArray();
        }
        $targetFound=false;
        foreach ((array)$rows as $row) {
            $lower=array_change_key_case((array)$row,CASE_LOWER);
            if (($lower['name']??null)===$targetName) $targetFound=true;
        }
        echo json_encode(['status'=>'pass','context_matched'=>true,
            'target_name_found'=>$targetFound,
            'nonempty'=>count((array)$rows)>0],JSON_UNESCAPED_SLASHES).PHP_EOL;
    } catch (Throwable $error) {
        $message=$error->getMessage();
        preg_match('/General error:\s*(-?\d+)/',$message,$match);
        echo json_encode(['status'=>'fail','class'=>get_class($error),
            'code'=>$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)],
            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);
}
