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> userStore = new ConcurrentHashMap<>();
    private final AtomicLong idGenerator = new AtomicLong(1);

    /** 初始化假数据 */
    public UserService() {
        initMockData();
    }

    private void initMockData() {
        save(new User(1L, "admin", "enc-pass", "管理员", "admin@example.com",
                "13800000001", 1L, 1, "2024-01-01 00:00:00", "2024-01-01 00:00:00",
                "192.168.1.1", "系统管理员"));
        save(new User(2L, "zhangsan", "enc-pass", "张三", "zhangsan@example.com",
                "13800000002", 1L, 1, "2024-01-02 00:00:00", "2024-01-02 00:00:00",
                "192.168.1.2", "普通用户"));
        idGenerator.set(3);
    }

    /**
     * 新增用户。
     *
     * @requirement(name="用户管理", id="SRS-F-01-001")
     * @param user 用户信息
     * @return 已保存的用户
     */
    public User save(User user) {
        if (user.getUserId() == null) {
            user.setUserId(idGenerator.getAndIncrement());
        }
        if (user.getCreateTime() == null) {
            user.setCreateTime(java.time.LocalDateTime.now().toString().replace("T", " "));
        }
        user.setUpdateTime(java.time.LocalDateTime.now().toString().replace("T", " "));
        userStore.put(user.getUserId(), user);
        return user;
    }

    /**
     * 编辑用户信息。
     *
     * @requirement(name="用户管理", id="SRS-F-01-001")
     * @param user 包含更新信息的用户对象
     * @return 更新后的用户，若ID不存在返回 null
     */
    public User update(User user) {
        User existing = userStore.get(user.getUserId());
        if (existing == null) {
            return null;
        }
        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.getStatus() != null) existing.setStatus(user.getStatus());
        if (user.getRemark() != null) existing.setRemark(user.getRemark());
        existing.setUpdateTime(java.time.LocalDateTime.now().toString().replace("T", " "));
        userStore.put(existing.getUserId(), existing);
        return existing;
    }

    /**
     * 根据ID删除用户。
     *
     * @requirement(name="用户管理", id="SRS-F-01-001")
     * @param userId 用户ID
     * @return 是否删除成功
     */
    public boolean deleteById(Long userId) {
        return userStore.remove(userId) != null;
    }

    /**
     * 根据ID查询用户。
     *
     * @param userId 用户ID
     * @return 用户对象，未找到返回 null
     */
    public User findById(Long userId) {
        return userStore.get(userId);
    }

    /**
     * 查询用户列表，支持按用户名和状态筛选。
     *
     * @requirement(name="用户管理", id="SRS-F-01-001")
     * @param username 用户名（可选，模糊匹配）
     * @param status   状态（可选）
     * @return 用户列表
     */
    public List<User> list(String username, Integer status) {
        return userStore.values().stream()
                .filter(u -> username == null || u.getUsername().contains(username))
                .filter(u -> status == null || u.getStatus().equals(status))
                .collect(Collectors.toList());
    }

    /**
     * 启用或停用用户。
     *
     * @requirement(name="用户管理", id="SRS-F-01-001")
     * @param userId 用户ID
     * @param status 状态：0-停用，1-启用
     * @return 操作后的用户，若ID不存在返回 null
     */
    public User updateStatus(Long userId, Integer status) {
        User user = userStore.get(userId);
        if (user == null) {
            return null;
        }
        user.setStatus(status);
        user.setUpdateTime(java.time.LocalDateTime.now().toString().replace("T", " "));
        return user;
    }

    /**
     * 获取所有用户列表（不分页）。
     *
     * @return 所有用户
     */
    public List<User> findAll() {
        return new ArrayList<>(userStore.values());
    }
}
