package com.example.demo.repository.impl;

import com.example.demo.model.TaskTemplate;
import com.example.demo.repository.TaskTemplateRepository;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

/**
 * 任务模板仓储内存实现。
 * <p>
 * 使用 ConcurrentHashMap 模拟数据库存储，应用启动时初始化示例模板数据。
 * 后续可替换为 MyBatis/JPA 等数据库实现。
 * </p>
 *
 * @requirement(name="任务模板匹配与生成", id="SRS-EHTG-06")
 * 结合知识库中的任务模板，自动生成符合标准的任务草案。
 */
@Repository
public class InMemoryTaskTemplateRepository implements TaskTemplateRepository {

    private final ConcurrentHashMap<String, TaskTemplate> store = new ConcurrentHashMap<>();

    public InMemoryTaskTemplateRepository() {
        initSampleData();
    }

    private void initSampleData() {
        save(new TaskTemplate("TPL-001", 1,
                "<task><type>侦察打击</type><phase>侦察</phase><action>高空侦察</action><target>固定目标</target></task>",
                "V1.0", true, "高空侦察打击模板", "适用于固定目标的侦察与精确打击"));

        save(new TaskTemplate("TPL-002", 2,
                "<task><type>电子干扰</type><phase>压制</phase><action>雷达干扰</action><target>移动目标</target></task>",
                "V1.0", true, "电子干扰压制模板", "适用于移动目标的电子干扰与压制"));

        save(new TaskTemplate("TPL-003", 3,
                "<task><type>联合打击</type><phase>协同</phase><action>多兵种协同打击</action><target>高价值目标</target></task>",
                "V2.0", true, "多兵种联合打击模板", "适用于高价值目标的联合打击行动"));

        save(new TaskTemplate("TPL-004", 1,
                "<task><type>侦察</type><phase>监视</phase><action>低空监视</action><target>区域监控</target></task>",
                "V1.5", false, "低空区域监控模板", "已停用，适用于区域监视"));
    }

    @Override
    public TaskTemplate save(TaskTemplate template) {
        store.put(template.getTemplateId(), template);
        return template;
    }

    @Override
    public Optional<TaskTemplate> findById(String templateId) {
        return Optional.ofNullable(store.get(templateId));
    }

    @Override
    public List<TaskTemplate> findAllActive() {
        return store.values().stream()
                .filter(TaskTemplate::isActive)
                .collect(Collectors.toList());
    }

    @Override
    public List<TaskTemplate> findByTargetType(int targetType) {
        return store.values().stream()
                .filter(t -> t.getTargetType() == targetType && t.isActive())
                .collect(Collectors.toList());
    }

    @Override
    public List<TaskTemplate> findAll() {
        return new ArrayList<>(store.values());
    }
}
