package com.cf.imes.module.system.util.locale;

import com.cf.imes.module.system.controller.admin.dict.vo.data.DictDataSimpleRespVO;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.*;

import static org.junit.jupiter.api.Assertions.*;

/**
 * {@link DictDataI18nCacheUtils} 的单元测试
 */
class DictDataI18nCacheUtilsTest {

    @BeforeEach
    void setUp() {
        // 测试前清理缓存
        DictDataI18nCacheUtils.clearCache();
    }

    @AfterEach
    void tearDown() {
        // 测试后清理缓存
        DictDataI18nCacheUtils.clearCache();
    }

    @Test
    void testPutCacheAndGetCache() {
        // 准备测试数据
        Map<String, List<DictDataSimpleRespVO>> testData = new HashMap<>();
        List<DictDataSimpleRespVO> dataList = new ArrayList<>();
        
        DictDataSimpleRespVO vo = new DictDataSimpleRespVO();
        vo.setDictType("gender");
        vo.setValue("1");
        vo.setLabel("男");
        dataList.add(vo);
        
        testData.put("gender", dataList);
        
        // 测试putCache方法
        DictDataI18nCacheUtils.putCache(testData);
        
        // 验证getCache方法
        Map<String, List<DictDataSimpleRespVO>> cache = DictDataI18nCacheUtils.getCache();
        assertNotNull(cache);
        assertEquals(1, cache.size());
        assertTrue(cache.containsKey("gender"));
        assertEquals(1, cache.get("gender").size());
        assertEquals("男", cache.get("gender").get(0).getLabel());
    }

    @Test
    void testGetCacheReturnsUnmodifiableMap() {
        // 准备测试数据
        Map<String, List<DictDataSimpleRespVO>> testData = new HashMap<>();
        List<DictDataSimpleRespVO> dataList = new ArrayList<>();
        DictDataSimpleRespVO vo = new DictDataSimpleRespVO();
        vo.setDictType("status");
        vo.setValue("1");
        vo.setLabel("启用");
        dataList.add(vo);
        testData.put("status", dataList);
        
        // 添加数据到缓存
        DictDataI18nCacheUtils.putCache(testData);
        
        // 获取缓存并尝试修改
        Map<String, List<DictDataSimpleRespVO>> cache = DictDataI18nCacheUtils.getCache();
        
        // 验证返回的是不可修改的Map
        assertThrows(UnsupportedOperationException.class, () -> {
            cache.put("newKey", new ArrayList<>());
        });
    }

    @Test
    void testClearCache() {
        // 准备测试数据
        Map<String, List<DictDataSimpleRespVO>> testData = new HashMap<>();
        List<DictDataSimpleRespVO> dataList = new ArrayList<>();
        DictDataSimpleRespVO vo = new DictDataSimpleRespVO();
        vo.setDictType("type");
        vo.setValue("1");
        vo.setLabel("标签");
        dataList.add(vo);
        testData.put("type", dataList);
        
        // 添加数据到缓存
        DictDataI18nCacheUtils.putCache(testData);
        
        // 验证缓存中有数据
        Map<String, List<DictDataSimpleRespVO>> cache = DictDataI18nCacheUtils.getCache();
        assertFalse(cache.isEmpty());
        
        // 清除缓存
        DictDataI18nCacheUtils.clearCache();
        
        // 验证缓存已清空
        cache = DictDataI18nCacheUtils.getCache();
        assertTrue(cache.isEmpty());
    }

    @Test
    void testPutCacheMultipleTimes() {
        // 测试多次添加缓存数据
        Map<String, List<DictDataSimpleRespVO>> testData1 = new HashMap<>();
        List<DictDataSimpleRespVO> dataList1 = new ArrayList<>();
        DictDataSimpleRespVO vo1 = new DictDataSimpleRespVO();
        vo1.setDictType("type1");
        vo1.setValue("1");
        vo1.setLabel("标签1");
        dataList1.add(vo1);
        testData1.put("key1", dataList1);
        
        DictDataI18nCacheUtils.putCache(testData1);
        
        Map<String, List<DictDataSimpleRespVO>> testData2 = new HashMap<>();
        List<DictDataSimpleRespVO> dataList2 = new ArrayList<>();
        DictDataSimpleRespVO vo2 = new DictDataSimpleRespVO();
        vo2.setDictType("type2");
        vo2.setValue("2");
        vo2.setLabel("标签2");
        dataList2.add(vo2);
        testData2.put("key2", dataList2);
        
        DictDataI18nCacheUtils.putCache(testData2);
        
        // 验证两个键都存在于缓存中
        Map<String, List<DictDataSimpleRespVO>> cache = DictDataI18nCacheUtils.getCache();
        assertEquals(2, cache.size());
        assertTrue(cache.containsKey("key1"));
        assertTrue(cache.containsKey("key2"));
    }

    @Test
    void testGetCacheWhenEmpty() {
        // 测试缓存为空时的情况
        Map<String, List<DictDataSimpleRespVO>> cache = DictDataI18nCacheUtils.getCache();
        assertNotNull(cache);
        assertTrue(cache.isEmpty());
    }
}