<?php
// +----------------------------------------------------------------------
// | saiadmin [ saiadmin快速开发框架 ]
// +----------------------------------------------------------------------
// | Author: your name
// +----------------------------------------------------------------------
namespace app\dice\validate\play_record;

use plugin\saiadmin\basic\BaseValidate;

/**
 * 玩家抽奖记录验证器
 */
class DicePlayRecordValidate extends BaseValidate
{
    /**
     * 定义验证规则
     */
    protected $rule =   [
        'player_id' => 'require',
        'lottery_config_id' => 'require',
        'lottery_type' => 'require',
        'is_win' => 'require',
        'win_coin' => 'require',
        'reward_tier' => 'require',
        'roll_array' => 'require|checkRollArray',
    ];

    /**
     * 定义错误信息
     */
    protected $message  =   [
        'player_id' => '玩家必须填写',
        'lottery_config_id' => '彩金池配置必须填写',
        'lottery_type' => '抽奖类型必须填写',
        'is_win' => '中奖必须填写',
        'win_coin' => '赢取平台币必须填写',
        'reward_tier' => '中奖档位必须填写',
        'roll_array.require' => '摇取点数必须填写',
    ];

    /**
     * 定义场景
     */
    protected $scene = [
        'save' => [
            'player_id',
            'lottery_config_id',
            'lottery_type',
            'is_win',
            'win_coin',
            'reward_tier',
            'roll_array',
        ],
        'update' => [
            'player_id',
            'lottery_config_id',
            'lottery_type',
            'is_win',
            'win_coin',
            'reward_tier',
            'roll_array',
        ],
    ];

    /**
     * 验证 roll_array：必须为 5 个元素，每个值在 1～6 之间
     * @param mixed $value
     * @param mixed $rule
     * @param array $data
     * @param string $field
     * @return bool|string
     */
    protected function checkRollArray($value, $rule = '', array $data = [], string $field = '')
    {
        if (is_string($value)) {
            $decoded = json_decode($value, true);
            $value = is_array($decoded) ? $decoded : [];
        }
        if (!is_array($value)) {
            return '摇取点数必须为数组';
        }
        if (count($value) !== 5) {
            return '摇取点数必须为 5 个数';
        }
        foreach ($value as $i => $n) {
            $v = is_numeric($n) ? (int) $n : null;
            if ($v === null || $v < 1 || $v > 6) {
                return '摇取点数第' . ($i + 1) . '个值必须在 1～6 之间';
            }
        }
        return true;
    }
}
