package org.hzhub.crm.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.hzhub.common.core.domain.R;
import org.hzhub.common.core.utils.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * ERP集成服务
 * 封装对 hzhub-erp 的调用
 *
 * @author hzhub
 */
@Slf4j
@RequiredArgsConstructor
@Service
public class ErpIntegrationService {

    @Value("${erp.base-url:http://localhost:8082}")
    private String erpBaseUrl;

    private final RestTemplate restTemplate;

    /**
     * 获取ERP公司列表
     *
     * @return 公司列表
     */
    public List<Map<String, Object>> getCompanyList() {
        try {
            String url = erpBaseUrl + "/erp/dynamic/v1/company/list";
            log.info("调用ERP服务获取公司列表: {}", url);

            R<List<Map<String, Object>>> response = restTemplate.getForObject(url, R.class);
            if (response != null && response.getCode() == 200) {
                return response.getData();
            }

            log.warn("ERP公司列表获取失败: response={}", response);
            return List.of();
        } catch (Exception e) {
            log.error("调用ERP服务获取公司列表异常", e);
            return List.of();
        }
    }

    /**
     * 获取ERP公司详情
     *
     * @param companyCode 公司编码
     * @return 公司信息
     */
    public Map<String, Object> getCompanyDetail(String companyCode) {
        if (StringUtils.isBlank(companyCode)) {
            return null;
        }

        try {
            String url = erpBaseUrl + "/erp/dynamic/v1/company/detail?companyCode=" + companyCode;
            log.info("调用ERP服务获取公司详情: {}", url);

            R<Map<String, Object>> response = restTemplate.getForObject(url, R.class);
            if (response != null && response.getCode() == 200) {
                return response.getData();
            }

            log.warn("ERP公司详情获取失败: companyCode={}, response={}", companyCode, response);
            return null;
        } catch (Exception e) {
            log.error("调用ERP服务获取公司详情异常: companyCode={}", companyCode, e);
            return null;
        }
    }

    /**
     * 获取ERP客户选择列表（按公司过滤，用于同步）
     *
     * @param keyword    关键词（可选）
     * @param companyIds 公司ID列表（逗号分隔）
     * @return 客户列表
     */
    public List<Map<String, Object>> getCustomerSelectList(String keyword, String companyIds) {
        if (StringUtils.isBlank(companyIds)) {
            return List.of();
        }

        // 分别查询每个公司的客户数据，然后合并
        List<Map<String, Object>> result = new ArrayList<>();
        String[] companyIdArray = companyIds.split(",");

        for (String companyId : companyIdArray) {
            if (StringUtils.isBlank(companyId)) {
                continue;
            }
            try {
                // 直接使用固定公司ID的SQL查询
                String url = erpBaseUrl + "/erp/dynamic/v1/customer/select?companyId=" + companyId.trim();
                log.info("调用ERP服务获取客户列表: companyId={}", companyId);

                R<List<Map<String, Object>>> response = restTemplate.getForObject(url, R.class);
                if (response != null && response.getCode() == 200 && response.getData() != null) {
                    result.addAll(response.getData());
                }
            } catch (Exception e) {
                log.error("调用ERP服务获取公司{}客户列表失败", companyId, e);
            }
        }

        log.info("ERP客户列表获取完成: 共{}条", result.size());
        return result;
    }

    /**
     * 获取ERP客户详情
     *
     * @param customerCode ERP客户编码
     * @return 客户信息（Map形式，包含customerName, contactName, phone等字段）
     */
    public Map<String, Object> getCustomerDetail(String customerCode) {
        if (StringUtils.isBlank(customerCode)) {
            return null;
        }

        try {
            String url = erpBaseUrl + "/erp/dynamic/v1/customer/detail?customerCode=" + customerCode;
            log.info("调用ERP服务获取客户详情: {}", url);

            R<Map<String, Object>> response = restTemplate.getForObject(url, R.class);
            if (response != null && response.getCode() == 200) {
                return response.getData();
            }

            log.warn("ERP客户详情获取失败: customerCode={}, response={}", customerCode, response);
            return null;
        } catch (Exception e) {
            log.error("调用ERP服务异常: customerCode={}", customerCode, e);
            return null;
        }
    }

    /**
     * 获取ERP客户列表（可选）
     *
     * @param params 查询参数
     * @return 客户列表
     */
    public Object getCustomerList(Map<String, Object> params) {
        try {
            String url = erpBaseUrl + "/erp/dynamic/v1/customer/list";
            log.info("调用ERP服务获取客户列表: {}", url);

            // 这里简化处理，实际应根据params构建查询参数
            R<Object> response = restTemplate.getForObject(url, R.class);
            if (response != null && response.getCode() == 200) {
                return response.getData();
            }

            log.warn("ERP客户列表获取失败: response={}", response);
            return null;
        } catch (Exception e) {
            log.error("调用ERP服务异常", e);
            return null;
        }
    }
}