package edu.whut.domain.tag.service;

import edu.whut.domain.tag.adapter.repository.ITagRepository;
import edu.whut.domain.tag.model.entity.CrowdTagsJobEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 人群标签服务
 */
@Slf4j
@Service
public class TagService implements ITagService {

    @Resource
    private ITagRepository repository;

    /**
     * 通常会被定时器或消息中间件触发，用来把符合某个标签规则的用户，批量写入到标签明细表和 Redis 位图中，并更新标签的统计量。
     * @param tagId   人群ID
     * @param batchId 批次ID
     */
    @Override
    public void execTagBatchJob(String tagId, String batchId) {
        log.info("人群标签批次任务 tagId:{} batchId:{}", tagId, batchId);

        // 1. 查询批次任务,拿到本次打标签要用的「统计规则」信息，比如时间范围、标签类型、规则表达式等
        CrowdTagsJobEntity crowdTagsJobEntity = repository.queryCrowdTagsJobEntity(tagId, batchId);

        // 2. 采集用户数据 - 这部分需要采集用户的消费类数据，后续有用户发起拼单后再处理。

        // 3. 数据写入记录（暂时模拟数据）
        List<String> userIdList = new ArrayList<String>() {{
            add("zy123");
            add("smile");
            add("smile01");
            add("smile02");
            add("smile03");
            add("smile04");
            add("smile05");
        }};

        // 4. 把用户写入标签明细表
        for (String userId : userIdList) {
            repository.addCrowdTagsUserId(tagId, userId);
        }

        // 5. 把本次新增的用户数量累加到主表 crowd_tags.statistics 字段里，统计当前有多少人打中了这个标签。
        repository.updateCrowdTagsStatistics(tagId, userIdList.size());
    }

}
