package com.example.demo.service;

import com.example.demo.model.Dept;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;

/**
 * 部门管理服务。
 * <p>支持部门的新增、编辑、删除、查询及树形层级结构维护。</p>
 */
@Service
public class DeptService {

    private final Map<Long, Dept> deptMap = new ConcurrentHashMap<>();
    private final AtomicLong idCounter = new AtomicLong(1);

    public DeptService() {
        long d1 = idCounter.getAndIncrement();
        deptMap.put(d1, new Dept(d1, "总公司", 0L, 1, "系统管理员", 1));
        long d2 = idCounter.getAndIncrement();
        deptMap.put(d2, new Dept(d2, "技术部", d1, 1, "张三", 1));
        long d3 = idCounter.getAndIncrement();
        deptMap.put(d3, new Dept(d3, "市场部", d1, 2, "李四", 1));
        long d4 = idCounter.getAndIncrement();
        deptMap.put(d4, new Dept(d4, "研发组", d2, 1, "王五", 1));
    }

    /**
     * 新增部门。
     *
     * @requirement(name="部门管理", id="SRS-F-01-003")
     * 创建新的部门并返回完整信息。
     */
    public Dept addDept(Dept dept) {
        long id = idCounter.getAndIncrement();
        dept.setId(id);
        if (dept.getStatus() == null) {
            dept.setStatus(1);
        }
        deptMap.put(id, dept);
        return dept;
    }

    /**
     * 编辑部门。
     *
     * @requirement(name="部门管理", id="SRS-F-01-003")
     * 修改已有部门的信息。
     */
    public Dept editDept(Dept dept) {
        Dept existing = deptMap.get(dept.getId());
        if (existing == null) {
            throw new RuntimeException("部门不存在，id=" + dept.getId());
        }
        if (dept.getDeptName() != null) existing.setDeptName(dept.getDeptName());
        if (dept.getParentId() != null) existing.setParentId(dept.getParentId());
        if (dept.getSortOrder() != null) existing.setSortOrder(dept.getSortOrder());
        if (dept.getLeader() != null) existing.setLeader(dept.getLeader());
        if (dept.getStatus() != null) existing.setStatus(dept.getStatus());
        return existing;
    }

    /**
     * 删除部门。
     *
     * @requirement(name="部门管理", id="SRS-F-01-003")
     * 根据ID删除指定部门。
     */
    public void deleteDept(Long id) {
        if (!deptMap.containsKey(id)) {
            throw new RuntimeException("部门不存在，id=" + id);
        }
        // 检查是否有子部门
        boolean hasChild = deptMap.values().stream().anyMatch(d -> d.getParentId() != null && d.getParentId().equals(id));
        if (hasChild) {
            throw new RuntimeException("该部门下存在子部门，无法删除");
        }
        deptMap.remove(id);
    }

    /**
     * 查询部门树（树形层级结构）。
     *
     * @requirement(name="部门管理", id="SRS-F-01-003")
     * 返回树形结构的部门列表。
     */
    public List<Dept> treeDepts() {
        List<Dept> all = new ArrayList<>(deptMap.values());
        // 按 parentId 排序，便于前端构建树
        return all;
    }

    /**
     * 根据ID查询部门。
     */
    public Dept getDeptById(Long id) {
        return deptMap.get(id);
    }
}
