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

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
import org.springframework.context.i18n.LocaleContextHolder;

import java.util.Locale;

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

/**
 * {@link LocaleUtils} 的单元测试
 */
class LocaleUtilsTest {

    private MockedStatic<LocaleContextHolder> mockedLocaleContextHolder;

    @BeforeEach
    void setUp() {
        // Mock静态类LocaleContextHolder
        mockedLocaleContextHolder = mockStatic(LocaleContextHolder.class);
    }

    @AfterEach
    void tearDown() {
        // 关闭静态mock
        if (mockedLocaleContextHolder != null) {
            mockedLocaleContextHolder.close();
        }
    }

    @Test
    void testGetLocaleWhenLocaleIsNull() {
        // 模拟getLocale返回null
        mockedLocaleContextHolder.when(LocaleContextHolder::getLocale).thenReturn(null);

        // 调用方法并验证结果
        String result = LocaleUtils.getLocale();
        assertNull(result);
    }

    @Test
    void testGetLocaleWhenLocaleIsChinese() {
        // 模拟getLocale返回中文环境
        mockedLocaleContextHolder.when(LocaleContextHolder::getLocale).thenReturn(Locale.CHINESE);

        // 调用方法并验证结果
        String result = LocaleUtils.getLocale();
        assertNull(result);
    }

    @Test
    void testGetLocaleWhenLocaleIsChineseVariant() {
        // 模拟getLocale返回中文环境变体
        mockedLocaleContextHolder.when(LocaleContextHolder::getLocale).thenReturn(Locale.SIMPLIFIED_CHINESE);

        // 调用方法并验证结果
        String result = LocaleUtils.getLocale();
        assertEquals("zh", result);
    }

    @Test
    void testGetLocaleWhenLocaleIsEnglish() {
        // 模拟getLocale返回英文环境
        mockedLocaleContextHolder.when(LocaleContextHolder::getLocale).thenReturn(Locale.ENGLISH);

        // 调用方法并验证结果
        String result = LocaleUtils.getLocale();
        assertEquals("en", result);
    }

    @Test
    void testGetLocaleWhenLocaleIsFrench() {
        // 模拟getLocale返回法文环境
        mockedLocaleContextHolder.when(LocaleContextHolder::getLocale).thenReturn(Locale.FRENCH);

        // 调用方法并验证结果
        String result = LocaleUtils.getLocale();
        assertEquals("fr", result);
    }

    @Test
    void testGetLocaleWhenLocaleIsGerman() {
        // 模拟getLocale返回德文环境
        mockedLocaleContextHolder.when(LocaleContextHolder::getLocale).thenReturn(Locale.GERMAN);

        // 调用方法并验证结果
        String result = LocaleUtils.getLocale();
        assertEquals("de", result);
    }

    @Test
    void testGetLocaleWhenLocaleIsJapan() {
        // 模拟getLocale返回日文环境
        mockedLocaleContextHolder.when(LocaleContextHolder::getLocale).thenReturn(Locale.JAPANESE);

        // 调用方法并验证结果
        String result = LocaleUtils.getLocale();
        assertEquals("ja", result);
    }
}