package cn.hztech.sdk.server;

import cn.hztech.sdk.api.UserApiClient;
import cn.hztech.sdk.integration.BaseIntegrationTest;
import cn.hztech.sdk.model.PageResult;
import cn.hztech.sdk.model.entity.Department;
import cn.hztech.sdk.model.entity.Role;
import cn.hztech.sdk.model.entity.User;
import cn.hztech.sdk.model.request.UserListRequest;
import cn.hztech.sdk.model.request.UserSearchRequest;
import org.junit.jupiter.api.*;

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

/**
 * User API服务端集成测试
 * <p>
 * 测试人员管理相关的所有API接口
 * <p>
 * 前置条件：
 * <ul>
 *   <li>platform-server已启动（端口8080）</li>
 *   <li>使用test profile启动</li>
 *   <li>测试数据已加载（USER_0001等）</li>
 * </ul>
 * <p>
 * 运行方式：
 * <pre>
 * # 启动服务器
 * cd sdk/platform-server
 * mvn spring-boot:run -Dspring.profiles.active=test
 *
 * # 运行测试
 * mvn test -Dtest=UserApiClientServerIntegrationTest
 * </pre>
 *
 * @author SDK Team
 * @since 1.0.0
 */
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class UserApiClientServerIntegrationTest extends BaseIntegrationTest {

    private UserApiClient userApiClient;

    @BeforeEach
    void setUp() {
        userApiClient = new UserApiClient(httpClient);
    }

    @Test
    @Order(1)
    @DisplayName("测试查询用户详情 - 成功场景")
    void testGetDetail_Success() {
        System.out.println("\n=== 测试查询用户详情 ===");

        try {
            // Act - 执行API调用
            User user = userApiClient.getDetail("USER_0001");

            // Assert - 验证结果
            assertNotNull(user, "用户不应为空");
            assertNotNull(user.getId(), "用户ID不应为空");
            assertEquals("USER_0001", user.getId(), "用户ID应匹配");
            assertNotNull(user.getAccount(), "用户账号不应为空");

            System.out.println("✓ 用户详情查询成功");
            System.out.println("  用户ID: " + user.getId());
            System.out.println("  账号: " + user.getAccount());
            System.out.println("  姓名: " + user.getRealName());
        } catch (Exception e) {
            System.err.println("✗ 用户详情查询失败: " + e.getMessage());
            e.printStackTrace();
            fail("用户详情查询失败: " + e.getMessage());
        }
    }

    @Test
    @Order(2)
    @DisplayName("测试查询用户列表 - 成功场景")
    void testGetList_Success() {
        System.out.println("\n=== 测试查询用户列表 ===");

        try {
            // Arrange - 准备测试数据
            UserListRequest request = new UserListRequest();
            request.setPageNum(1);
            request.setPageSize(10);

            // Act - 执行API调用
            PageResult<User> pageResult = userApiClient.getList(request);

            // Assert - 验证结果
            assertNotNull(pageResult, "分页结果不应为空");
            assertNotNull(pageResult.getList(), "用户列表不应为空");
            assertTrue(pageResult.getList().size() > 0, "用户列表应该有数据");
            assertNotNull(pageResult.getTotal(), "总数不应为空");

            System.out.println("✓ 用户列表查询成功");
            System.out.println("  总数: " + pageResult.getTotal());
            System.out.println("  当前页: " + pageResult.getPageNum());
            System.out.println("  页大小: " + pageResult.getPageSize());
            System.out.println("  用户数: " + pageResult.getList().size());
        } catch (Exception e) {
            System.err.println("✗ 用户列表查询失败: " + e.getMessage());
            e.printStackTrace();
            fail("用户列表查询失败: " + e.getMessage());
        }
    }

    @Test
    @Order(3)
    @DisplayName("测试搜索用户 - 成功场景")
    void testSearch_Success() {
        System.out.println("\n=== 测试搜索用户 ===");

        try {
            // Arrange - 准备测试数据
            UserSearchRequest request = new UserSearchRequest();
            request.setKeyword("USER");
            request.setPageNum(1);
            request.setPageSize(10);

            // Act - 执行API调用
            PageResult<User> pageResult = userApiClient.search(request);

            // Assert - 验证结果
            assertNotNull(pageResult, "分页结果不应为空");
            assertNotNull(pageResult.getList(), "搜索结果不应为空");

            System.out.println("✓ 用户搜索成功");
            System.out.println("  搜索结果数: " + pageResult.getList().size());
            System.out.println("  总数: " + pageResult.getTotal());
        } catch (Exception e) {
            System.err.println("✗ 用户搜索失败: " + e.getMessage());
            e.printStackTrace();
            fail("用户搜索失败: " + e.getMessage());
        }
    }

    @Test
    @Order(4)
    @DisplayName("测试查询用户角色 - 成功场景")
    void testGetRoles_Success() {
        System.out.println("\n=== 测试查询用户角色 ===");

        try {
            // Act - 执行API调用
            Role user = userApiClient.getRoles("USER_0001");

            // Assert - 验证结果
            assertNotNull(user, "用户不应为空");
            assertNotNull(user.getId(), "角色ID不应为空");
            assertNotNull(user.getRoleName(), "角色名称不应为空");

            System.out.println("✓ 用户角色查询成功");
            System.out.println("  角色ID: " + user.getId());
            System.out.println("  角色名称: " + user.getRoleName());
        } catch (Exception e) {
            System.err.println("✗ 用户角色查询失败: " + e.getMessage());
            e.printStackTrace();
            fail("用户角色查询失败: " + e.getMessage());
        }
    }

    @Test
    @Order(5)
    @DisplayName("测试查询用户部门 - 成功场景")
    void testGetDepartment_Success() {
        System.out.println("\n=== 测试查询用户部门 ===");

        try {
            // Act - 执行API调用
            Department user = userApiClient.getDepartment("USER_0001");

            // Assert - 验证结果
            assertNotNull(user, "用户不应为空");
            assertNotNull(user.getId(), "部门ID不应为空");
            assertNotNull(user.getDeptName(), "部门名称不应为空");

            System.out.println("✓ 用户部门查询成功");
            System.out.println("  部门ID: " + user.getId());
            System.out.println("  部门名称: " + user.getDeptName());
        } catch (Exception e) {
            System.err.println("✗ 用户部门查询失败: " + e.getMessage());
            e.printStackTrace();
            fail("用户部门查询失败: " + e.getMessage());
        }
    }
}
