package com.example.demo.service;

import com.example.demo.model.User;
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 UserService {

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

    public UserService() {
        // 初始化假数据
        long t1 = idCounter.getAndIncrement();
        userMap.put(t1, new User(t1, "admin", "123456", "系统管理员", "admin@demo.com",
                "13800000001", 1L, 1, "2026-01-01 00:00:00", "超级管理员"));
        long t2 = idCounter.getAndIncrement();
        userMap.put(t2, new User(t2, "zhangsan", "123456", "张三", "zhangsan@demo.com",
                "13800000002", 2L, 1, "2026-01-02 08:30:00", "普通用户"));
    }

    /**
     * 新增用户。
     *
     * @requirement(name="用户管理", id="SRS-F-01-001")
     * 创建新的系统用户并返回完整用户信息。
     */
    public User addUser(User user) {
        long id = idCounter.getAndIncrement();
        user.setId(id);
        user.setCreateTime(java.time.LocalDateTime.now().toString().replace("T", " "));
        user.setUpdateTime(user.getCreateTime());
        if (user.getStatus() == null) {
            user.setStatus(1);
        }
        userMap.put(id, user);
        return user;
    }

    /**
     * 编辑用户。
     *
     * @requirement(name="用户管理", id="SRS-F-01-001")
     * 修改已有用户的信息。
     */
    public User editUser(User user) {
        User existing = userMap.get(user.getId());
        if (existing == null) {
            throw new RuntimeException("用户不存在，id=" + user.getId());
        }
        if (user.getUsername() != null) existing.setUsername(user.getUsername());
        if (user.getRealName() != null) existing.setRealName(user.getRealName());
        if (user.getEmail() != null) existing.setEmail(user.getEmail());
        if (user.getPhone() != null) existing.setPhone(user.getPhone());
        if (user.getDeptId() != null) existing.setDeptId(user.getDeptId());
        if (user.getRemark() != null) existing.setRemark(user.getRemark());
        existing.setUpdateTime(java.time.LocalDateTime.now().toString().replace("T", " "));
        userMap.put(existing.getId(), existing);
        return existing;
    }

    /**
     * 删除用户。
     *
     * @requirement(name="用户管理", id="SRS-F-01-001")
     * 根据ID删除指定用户。
     */
    public void deleteUser(Long id) {
        if (!userMap.containsKey(id)) {
            throw new RuntimeException("用户不存在，id=" + id);
        }
        userMap.remove(id);
    }

    /**
     * 查询用户列表（支持模糊搜索和分页）。
     *
     * @requirement(name="用户管理", id="SRS-F-01-001")
     * 根据关键字模糊搜索用户名、真实姓名，支持分页查询。
     */
    public List<User> listUsers(String keyword, int page, int size) {
        List<User> all = new ArrayList<>(userMap.values());
        if (keyword != null && !keyword.isEmpty()) {
            all = all.stream()
                    .filter(u -> (u.getUsername() != null && u.getUsername().contains(keyword))
                            || (u.getRealName() != null && u.getRealName().contains(keyword)))
                    .collect(Collectors.toList());
        }
        // 分页
        int start = (page - 1) * size;
        int end = Math.min(start + size, all.size());
        if (start >= all.size()) {
            return new ArrayList<>();
        }
        return all.subList(start, end);
    }

    /**
     * 启用/停用用户。
     *
     * @requirement(name="用户管理", id="SRS-F-01-001")
     * 修改用户的状态（启用或停用）。
     */
    public User toggleUserStatus(Long id, Integer status) {
        User user = userMap.get(id);
        if (user == null) {
            throw new RuntimeException("用户不存在，id=" + id);
        }
        user.setStatus(status);
        user.setUpdateTime(java.time.LocalDateTime.now().toString().replace("T", " "));
        return user;
    }

    /**
     * 重置用户密码。
     *
     * @requirement(name="用户管理", id="SRS-F-01-001")
     * 将用户密码重置为默认密码。
     */
    public User resetPassword(Long id, String newPassword) {
        User user = userMap.get(id);
        if (user == null) {
            throw new RuntimeException("用户不存在，id=" + id);
        }
        user.setPassword(newPassword != null ? newPassword : "123456");
        user.setUpdateTime(java.time.LocalDateTime.now().toString().replace("T", " "));
        return user;
    }

    /**
     * 根据ID查询用户。
     */
    public User getUserById(Long id) {
        return userMap.get(id);
    }
}
