<?php
declare(strict_types=1);
$root=$argv[1]??'';$module=$argv[2]??'';if(!in_array($module,['store','terminal'],true))exit(78);$tenant=$module==='store'?2147001111:2147001112;function getStoreId():int{return $GLOBALS['tenant'];}function app_name():string{return $GLOBALS['module'];}
$schema=json_decode(file_get_contents(__DIR__.'/structure-B.json'),true)['tables'];require $root.'/vendor/autoload.php';spl_autoload_register(static function($class)use($root){foreach(['app\\'=>'app/','cores\\'=>'cores/'] as $prefix=>$dir)if(strpos($class,$prefix)===0){$f=$root.'/'.$dir.str_replace('\\','/',substr($class,strlen($prefix))).'.php';if(is_file($f))require $f;}},true,true);require $root.'/app/common/database/DmBuilder.php';if(getenv('DASHBOARD_SERVICE_FILE'))require getenv('DASHBOARD_SERVICE_FILE');
trait RankingCaptureMethods{
 public array $sql=[];public array $binds=[];
 public function connect(array $config=[],$linkNum=0,$autoConnection=false):\PDO{throw new RuntimeException('No PDO permitted in source compiler');}
 public function getFields(string $tableName):array{$name=trim(str_replace(['yoshop_','`','"'],'',$tableName));$r=[];if(!isset($GLOBALS['schema'][$name]))throw new RuntimeException('Unfrozen actual metadata '.$name);foreach($GLOBALS['schema'][$name]['columns'] as $c)$r[$c['column_name']]=['name'=>$c['column_name'],'type'=>$c['column_type'],'primary'=>$c['extra']==='auto_increment','autoinc'=>false];return $r;}
 public function select(\think\db\BaseQuery $q):array{$q->parseOptions();$this->sql[]=$this->getBuilder()->select($q,false);$this->binds[]=array_map(static function($b){return $b[0];},$q->getBind(false));return [];}
}
class GoodsRankingMysqlCapture extends \think\db\connector\Mysql{use RankingCaptureMethods;}
class GoodsRankingDmCapture extends \app\common\database\Dm{use RankingCaptureMethods;}
$out=['module'=>$module,'tenant'=>$tenant,'PDO_opens'=>0,'SQL_executed'=>0,'dialects'=>[]];foreach(['mysql'=>\think\db\builder\Mysql::class,'dm'=>\app\common\database\DmBuilder::class] as $dialect=>$builder){\cores\BaseModel::$storeId=$tenant;$db=new \think\DbManager();$db->setConfig(['default'=>'mysql','connections'=>['mysql'=>['type'=>'\\'.($dialect==='dm'?GoodsRankingDmCapture::class:GoodsRankingMysqlCapture::class),'builder'=>$builder,'prefix'=>'yoshop_','fields_strict'=>false]]]);$class='app\\'.$module.'\\service\\statistics\\data\\GoodsRanking';$ref=new ReflectionClass($class);$service=$ref->newInstanceWithoutConstructor();$service->getGoodsRanking();$capture=$db->connect('mysql');$out['service_sha256']=hash_file('sha256',$ref->getFileName());$out['dialects'][$dialect]=['sql'=>$capture->sql,'binds'=>$capture->binds,'actual_connection_is_dm'=>$capture instanceof \app\common\database\Dm];}
$tag=$argv[3]??(getenv('DASHBOARD_SERVICE_FILE')?'candidate':'current');if(!preg_match('/^[a-z0-9-]{1,50}$/D',$tag))exit(78);$destination=__DIR__.'/compiler-'.$tag.'-'.$module.'.json';if(!is_file($destination))file_put_contents($destination,json_encode($out,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));echo json_encode($out,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES),"\n";
