<?php

declare(strict_types=1);

use app\common\model\user\SubsidyLog;
use think\facade\Db;

require '/workspace/zhct/zhctproject/ai_api/env.php';
require '/workspace/zhct/zhctproject/ai_api/vendor/autoload.php';

if (TP_ENV !== 'local') {
    throw new RuntimeException('Only local environment is allowed');
}
$app = new \think\App();
$app->setEnvName(TP_ENV);
$app->initialize();
$connection = config('database.connections.mysql');
$database = (string)Db::query('SELECT DATABASE() AS database_name')[0]['database_name'];
if ($connection['hostname'] !== '101.200.165.56' || $database !== 'ai_zhct') {
    throw new RuntimeException('Unexpected database target');
}

$action = $argv[1] ?? '';
if ($action === 'setup') {
    $marker = 'VWCG-1381-LOCAL-' . date('YmdHis') . '-' . random_int(1000, 9999);
    $now = time();
    $userId = (int)Db::name('user')->insertGetId([
        'mobile' => '1381' . random_int(1000000, 9999999),
        'nick_name' => $marker,
        'balance' => '90.00',
        'subsidy_balance' => '70.00',
        'store_id' => 10001,
        'create_time' => $now,
        'update_time' => $now,
    ]);
    $cashIds = [];
    foreach ([['100.00', null, 10], ['-30.00', null, 20], ['20.00', '90.00', 30]] as $offset => $item) {
        $cashIds[] = (int)Db::name('user_balance_log')->insertGetId([
            'user_id' => $userId,
            'scene' => $item[2],
            'money' => $item[0],
            'balance_after' => $item[1],
            'order_id' => 138100 + $offset,
            'describe' => $marker . '-现金-' . $offset,
            'store_id' => 10001,
            'create_time' => $now + $offset,
        ]);
    }
    $subsidyIds = [];
    foreach ([['100.00', 10], ['-30.00', 20]] as $offset => $item) {
        $subsidyIds[] = (int)Db::name('user_subsidy_log')->insertGetId([
            'user_id' => $userId,
            'scene' => $item[1],
            'money' => $item[0],
            'subsidy_balance_after' => null,
            'operator_name' => '',
            'order_id' => 138200 + $offset,
            'describe' => $marker . '-补贴-' . $offset,
            'store_id' => 10001,
            'create_time' => $now + $offset,
        ]);
    }
    $subsidyGrantId = (int)Db::name('user_subsidy')->insertGetId([
        'user_id' => $userId,
        'money' => '70.00',
        'store_id' => 10001,
        'is_delete' => 0,
        'is_expire' => 0,
        'expiration_start_time' => '2020-01-01 00:00:00',
        'expiration_end_time' => '2099-01-01 00:00:00',
    ]);
    echo json_encode(compact('database', 'marker', 'userId', 'cashIds', 'subsidyIds', 'subsidyGrantId'), JSON_UNESCAPED_UNICODE) . PHP_EOL;
    exit;
}

$userId = (int)($argv[2] ?? 0);
if ($userId <= 0 || strpos((string)Db::name('user')->where('user_id', $userId)->value('nick_name'), 'VWCG-1381-LOCAL-') !== 0) {
    throw new RuntimeException('Fixture user not found');
}
if ($action === 'post-init') {
    $cash = Db::name('user_balance_log')->where('user_id', $userId)->order('log_id')->column('balance_after');
    $subsidy = Db::name('user_subsidy_log')->where('user_id', $userId)->order('log_id')->column('subsidy_balance_after');
    $cash = array_map('strval', $cash);
    $subsidy = array_map('strval', $subsidy);
    if ($cash !== ['100.00', '70.00', '90.00'] || $subsidy !== ['100.00', '70.00']) {
        throw new RuntimeException('Unexpected initialization result: ' . json_encode(compact('cash', 'subsidy')));
    }
    echo json_encode(compact('userId', 'cash', 'subsidy'), JSON_UNESCAPED_UNICODE) . PHP_EOL;
    exit;
}
if ($action === 'add-ai-model') {
    $grantId = (int)Db::name('user_subsidy')->where('user_id', $userId)->where('is_expire', 0)->value('id');
    Db::name('user_subsidy')->where('id', $grantId)->update(['money' => '90.00']);
    Db::name('user')->where('user_id', $userId)->update(['subsidy_balance' => '90.00']);
    SubsidyLog::add(30, [
        'user_id' => $userId,
        'money' => '20.00',
        'order_id' => 138203,
        'operator_name' => 'VWCG1381测试员',
    ], ['VWCG1381测试员'], 10001);
    $row = Db::name('user_subsidy_log')->where('user_id', $userId)->order('log_id', 'desc')->find();
    if ((string)$row['subsidy_balance_after'] !== '90.00' || $row['operator_name'] !== 'VWCG1381测试员') {
        throw new RuntimeException('AI model write failed');
    }
    echo json_encode(['userId' => $userId, 'aiModelLogId' => (int)$row['log_id'], 'balanceAfter' => $row['subsidy_balance_after']], JSON_UNESCAPED_UNICODE) . PHP_EOL;
    exit;
}
if ($action === 'readback') {
    $cash = Db::name('user_balance_log')->where('user_id', $userId)
        ->order('log_id', 'asc')->field('log_id,scene,money,balance_after,describe')->select()->toArray();
    $subsidy = Db::name('user_subsidy_log')->where('user_id', $userId)
        ->order('log_id', 'asc')->field('log_id,scene,money,subsidy_balance_after,operator_name,describe')->select()->toArray();
    $grants = Db::name('user_subsidy')->where('user_id', $userId)
        ->order('id', 'asc')->field('id,money,is_expire,expiration_end_time')->select()->toArray();
    echo json_encode(compact('database', 'userId', 'cash', 'subsidy', 'grants'), JSON_UNESCAPED_UNICODE) . PHP_EOL;
    exit;
}
throw new InvalidArgumentException('Unknown action');
