<?php

namespace App\Http\Requests\Company\Tag;

use App\Http\Requests\BaseRequest;
use Illuminate\Validation\Rule;

/**
 * 自动打标签任务模板接口验证
 * @author 唐远望
 * @version 1.0
 * @date 2025-10-17
 * 
 */
class TagTaskTemplates extends BaseRequest
{
    /**
     * 获取应用于请求的规则
     *
     * @return array
     */
    public function rules()
    {
        // 返回结果
        $rules = [
            'name'                 => 'required',
            'id'                => 'required|integer|gt:0',
            'status'            => 'required|integer|in:0,1',
            'page'              => 'integer|min:1',
            'limit'             => 'integer|min:1',
            'task_name'          => 'required',
            'rules'   => 'required|array',
            'rules.*.tag_ids'   => 'required|string', //标签ID验证
            'rules.*.task_type' => 'required|integer|in:1,2', //规则类型1=活动2=直播
        ];

        $rules['rules.*.activity_type'] = [  // 活动类型1=拉新抽奖2=拉新活动3=签到4=积分抽奖5=下单抽奖6=答题活动（当task_type=1（活动类型）时必填）
            Rule::requiredIf(function () {
                // 检查当前规则索引是否为活动类型
                $index = $this->getCurrentRuleIndex();
                if ($index === null) return false;
                
                $rule = $this->input("rules.{$index}", []);
                return isset($rule['task_type']) && $rule['task_type'] == 1;
            }),
            'nullable',
            'string',
        ];
        
        $rules['rules.*.activity_ids'] = [  // 活动ID验证
            Rule::requiredIf(function () {
                // 检查当前规则索引是否为活动类型
                $index = $this->getCurrentRuleIndex();
                if ($index === null) return false;
                
                $rule = $this->input("rules.{$index}", []);
                return isset($rule['task_type']) && $rule['task_type'] == 1;
            }),
            'nullable',
            'string',
        ];
        
        $rules['rules.*.days'] = [  // 签到天数
            Rule::requiredIf(function () {
                // 检查当前规则索引是否为签到活动
                $index = $this->getCurrentRuleIndex();
                if ($index === null) return false;
                
                $rule = $this->input("rules.{$index}", []);
                return isset($rule['task_type']) && $rule['task_type'] == 1 && 
                       isset($rule['activity_type']) && $rule['activity_type'] == 3;
            }),
            'nullable',
            'integer',
        ];
        
        $rules['rules.*.live_ids'] = [  // 直播间ID验证
            Rule::requiredIf(function () {
                // 检查当前规则索引是否为直播类型
                $index = $this->getCurrentRuleIndex();
                if ($index === null) return false;
                
                $rule = $this->input("rules.{$index}", []);
                return isset($rule['task_type']) && $rule['task_type'] == 2;
            }),
            'nullable',
            'string',
        ];
        
        $rules['rules.*.user_behavior_type'] = [ //行为类型(直播：1=中奖2=未中奖)、(拉新抽奖：1=中奖2=未中奖)、(拉新活动:行为默认为空)、(签到:1=连续签到2=累计签到)、(答题活动:1=中奖2=未中奖)
            Rule::requiredIf(function () {
                // 检查当前规则索引是否需要行为类型
                $index = $this->getCurrentRuleIndex();
                if ($index === null) return false;
                
                $rule = $this->input("rules.{$index}", []);
                $activity_type = isset($rule['activity_type']) ? $rule['activity_type'] : 0;
                
                // 当活动类型存在且不等于2（拉新活动）时，需要验证行为类型
                return $activity_type > 0 && $activity_type != 2;
            }),
            'nullable',
            'integer',
        ];
        
        return $rules;
    }

    /**
     * 获取当前验证的规则索引
     * 通过解析验证的字段名来获取索引
     */
    protected function getCurrentRuleIndex()
    {
        // 获取当前正在验证的字段
        $currentField = $this->validationData()['_current_field'] ?? null;
        
        if ($currentField && preg_match('/rules\.(\d+)\./', $currentField, $matches)) {
            return $matches[1];
        }
        
        return null;
    }

    // 场景列表
    protected   $scenes         = [
        'detail'             => ['id'],
        'list'               => ['page', 'limit'],
        'add'                => ['task_name', 'rules', 'rules.*.task_type', 'rules.*.activity_type', 'rules.*.activity_ids', 'rules.*.live_ids', 'rules.*.user_behavior_type', 'rules.*.days', 'rules.*.tag_ids'],
        'edit'               => ['id', 'task_name', 'rules', 'rules.*.task_type', 'rules.*.activity_type', 'rules.*.activity_ids', 'rules.*.live_ids', 'rules.*.user_behavior_type', 'rules.*.days', 'rules.*.tag_ids'],
        'set_status'         => ['id', 'status'],
        'delete'             => ['id'],
    ];

    /**
     * 获取已定义验证规则的错误消息
     *
     * @return array
     */
    public function messages()
    {
        return [
            'name.required'     => '名称必填',
            'id.required'       => 'ID未知',
            'id.integer'        => 'ID格式错误',
            'id.gt'             => 'ID格式错误',
            'status.required'   => '状态未知',
            'status.integer'    => '状态格式错误',
            'status.in'         => '状态格式错误',
            'page.integer'      => '页码格式错误',
            'page.min'          => '页码格式错误',
            'limit.integer'     => '每页数量格式错误',
            'limit.min'         => '每页数量格式错误',
            'task_name.required' => '任务名称必填',
            'rules.required' => '规则必填',
            'rules.array' => '规则格式错误',
            'rules.*.tag_ids.required' => '标签ID必填',
            'rules.*.tag_ids.string' => '标签ID格式错误',
            'rules.*.task_type.required' => '规则类型必填',
            'rules.*.task_type.integer' => '规则类型格式错误',
            'rules.*.task_type.in' => '规则类型格式错误',
            'rules.*.live_ids.required' => '规则类型为直播时,直播间ID必填',
            'rules.*.live_ids.string' => '直播间ID格式错误',
            'rules.*.user_behavior_type.required' => '行为类型必填',
            'rules.*.user_behavior_type.integer' => '行为类型格式错误',
            'rules.*.activity_type.required' => '规则类型为活动时,活动类型必填',
            'rules.*.activity_type.string' => '活动类型格式错误',
            'rules.*.activity_ids.required' => '规则类型为活动时,活动ID必填',
            'rules.*.activity_ids.string' => '活动ID格式错误',
            'rules.*.days.required' => '规则类型为签到活动时,签到天数必填',
            'rules.*.days.integer' => '签到天数格式错误',
        ];
    }
}