package com.haha.sdk.api;

import com.haha.sdk.HahaClient;
import com.haha.sdk.exception.HahaException;
import lombok.extern.slf4j.Slf4j;

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

/**
 * 商品相关API
 * 
 * @author haha-sdk
 * @version 1.0.0
 */
@Slf4j
public class GoodsApi extends BaseApi {
    
    public GoodsApi(HahaClient client) {
        super(client);
    }
    
    /**
     * 获取设备可售卖商品列表
     * 
     * @param deviceId 设备ID
     * @param code 商品code（可选）
     * @return 商品列表
     * @throws HahaException 调用失败时抛出
     */
    public Map<String, Object> getDeviceGoodsList(String deviceId, String code) throws HahaException {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", client.getAccessToken());
        params.put("device_id", deviceId);
        if (code != null && !code.isEmpty()) {
            params.put("code", code);
        }
        
        Map<String, Object> result = post("/product/getProductsListByDeviceId", params);
        return (Map<String, Object>) result.get("data");
    }
    
    /**
     * 获取商品总库列表
     * 
     * @param pageNo 页码
     * @param pageSize 每页条数
     * @param barcode 条形码，多个条形码用逗号隔开（可选）
     * @param code 商品code，多个商品code用逗号隔开（可选）
     * @param productName 商品名称（可选）
     * @param deviceAdapt 适应设备（可选）
     * @return 商品总库信息
     * @throws HahaException 调用失败时抛出
     */
    public Map<String, Object> getTotalList(int pageNo, int pageSize, String barcode, String code, 
                                            String productName, String deviceAdapt) throws HahaException {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", client.getAccessToken());
        params.put("page_no", String.valueOf(pageNo));
        params.put("page_size", String.valueOf(pageSize));
        if (barcode != null && !barcode.isEmpty()) {
            params.put("barcode", barcode);
        }
        if (code != null && !code.isEmpty()) {
            params.put("code", code);
        }
        if (productName != null && !productName.isEmpty()) {
            params.put("product_name", productName);
        }
        if (deviceAdapt != null && !deviceAdapt.isEmpty()) {
            params.put("device_adapt", deviceAdapt);
        }
        
        Map<String, Object> result = post("/product/getAssignedProducts", params);
        return (Map<String, Object>) result.get("data");
    }
    
    /**
     * 添加商品至商家商品库
     * 
     * @param codeList 商品列表(传入哈哈的商品编码,多个中间用逗号隔开)
     * @return 是否成功
     * @throws HahaException 调用失败时抛出
     */
    public boolean addToMerchant(String codeList) throws HahaException {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", client.getAccessToken());
        params.put("code_list", codeList);
        
        post("/Product/addClientProducts", params);
        return true;
    }
    
    /**
     * 获取商家商品库列表
     * 
     * @param pageNo 页码
     * @param pageSize 每页条数
     * @param name 商品名称（可选）
     * @param barCode 商品条码（可选）
     * @param applyStatus 适用设备:1全部柜，2静态柜，3动态柜（可选）
     * @param code 商品编码（可选）
     * @return 商家商品库信息
     * @throws HahaException 调用失败时抛出
     */
    public Map<String, Object> getMerchantList(int pageNo, int pageSize, String name, 
                                                String barCode, String applyStatus, String code) throws HahaException {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", client.getAccessToken());
        params.put("page_no", String.valueOf(pageNo));
        params.put("page_size", String.valueOf(pageSize));
        if (name != null && !name.isEmpty()) {
            params.put("name", name);
        }
        if (barCode != null && !barCode.isEmpty()) {
            params.put("bar_code", barCode);
        }
        if (applyStatus != null && !applyStatus.isEmpty()) {
            params.put("apply_status", applyStatus);
        }
        if (code != null && !code.isEmpty()) {
            params.put("code", code);
        }
        
        Map<String, Object> result = post("/product/getClientProducts", params);
        return (Map<String, Object>) result.get("data");
    }
    
    /**
     * 商品上下架（修改设备柜模版）
     * 给指定设备配置可售卖的商品，对应哈哈 API 4.5
     * 对于柜模版(CABINET)设备，此方法用于更新设备商品配置
     *
     * @param deviceId 设备id，sn号
     * @param goodsCode 商品code,多个商品code用逗号(,)隔开
     * @param salesType 上下架类型:IN上架，OUT下架。call_type='CHANGE'时必传。
     * @param callType 请求更新方式：CHANGE更新模式，COVER覆盖模式，不传默认值是CHANGE。
     * @return 是否成功
     * @throws HahaException 调用失败时抛出
     */
    public Map<String, Object> setStatus(String deviceId, String goodsCode, String salesType, String callType) throws HahaException {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", client.getAccessToken());
        params.put("device_id", deviceId);
        params.put("goods_code", goodsCode);
        if (salesType != null && !salesType.isEmpty()) {
            params.put("sales_type", salesType);
        }
        if (callType != null && !callType.isEmpty()) {
            params.put("call_type", callType);
        }
        
        Map<String, Object> result = post("/systemtemplate/deviceGoods", params);
        return (Map<String, Object>) result.get("data");
    }
 
    /**
     * 获取设备柜模版数据
     * 获取静态柜设备的可售卖商品列表，对应哈哈 API 4.1
     * 对于柜模版(CABINET)设备，此方法用于获取设备商品配置
     *
     * @param deviceId 设备ID
     * @return 柜模版商品数据
     * @throws HahaException 调用失败时抛出
     */
    public Map<String, Object> getCabinetTemplate(String deviceId) throws HahaException {
        return getDeviceGoodsList(deviceId, null);
    }

    /**
     * 更新设备柜模版
     * 覆盖式更新静态柜设备的商品配置，对应哈哈 API 4.5
     *
     * @param deviceId 设备ID
     * @param goodsCode 商品code列表，多个用逗号隔开
     * @param callType 请求更新方式：CHANGE更新模式，COVER覆盖模式
     * @return 更新结果
     * @throws HahaException 调用失败时抛出
     */
    public Map<String, Object> updateCabinetTemplate(String deviceId, String goodsCode, String callType) throws HahaException {
        return setStatus(deviceId, goodsCode, null, callType);
    }
    
    /**
     * 获取设备层模板
     * 获取设备的货架层级模板配置
     * 
     * @param deviceId 设备ID
     * @return 层模板信息
     * @throws HahaException 调用失败时抛出
     */
    public Map<String, Object> getLayerTemplate(String deviceId) throws HahaException {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", client.getAccessToken());
        params.put("device_id", deviceId);
        
        Map<String, Object> result = post("/product/getLayerTypeInfo", params);
        return (Map<String, Object>) result.get("data");
    }
    
    /**
     * 创建或更新层模板
     * 创建或更新设备的货架层级模板
     * 
     * @param deviceId 设备ID
     * @param products 层模板商品数据(json)
     * @return 是否成功
     * @throws HahaException 调用失败时抛出
     */
    public Map<String, Object> updateLayerTemplate(String deviceId, String products) throws HahaException {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", client.getAccessToken());
        params.put("device_id", deviceId);
        params.put("products", products);
        
        Map<String, Object> result = post("/product/postLayerTypeInfo", params);
        return (Map<String, Object>) result.get("data");
    }
    
    /**
     * 新品申请
     * 商家申请添加新商品到哈哈平台商品总库
     * 
     * @param params 新品申请参数，详见API文档
     * @return 新品申请工单编号
     * @throws HahaException 调用失败时抛出
     */
    public Map<String, Object> applyNew(Map<String, String> params) throws HahaException {
        params.put("access_token", client.getAccessToken());
        
        Map<String, Object> result = post("/goods/addClientNewGoodsInfo", params);
        return (Map<String, Object>) result.get("data");
    }
    
    /**
     * 查询商品编号对应关系
     * 查询商家商品ID与哈哈平台商品ID的对应关系
     * 
     * @param codeList 哈哈商品编号列表，多个用逗号隔开（可选）
     * @return 对应关系信息
     * @throws HahaException 调用失败时抛出
     */
    public Map<String, Object> getIdMapping(String codeList) throws HahaException {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", client.getAccessToken());
        if (codeList != null && !codeList.isEmpty()) {
            params.put("code_list", codeList);
        }
        
        Map<String, Object> result = post("/product/getProductsRelation", params);
        return (Map<String, Object>) result.get("data");
    }
    
    /**
     * 上传图片
     * 用于新品申请时上传商品图片
     * 
     * @param file 图片文件
     * @return 图片地址
     * @throws HahaException 调用失败时抛出
     */
    public String uploadImage(java.io.File file) throws HahaException {
        // 注意：这个接口需要multipart/form-data格式，需要特殊处理
        // 该方法需要在HttpUtils中添加文件上传支持
        throw new HahaException("文件上传功能尚未实现，请使用img_type=url方式");
    }
    
    /**
     * 查看新品申请
     * 获取新品申请商品信息
     * 
     * @param code 商品code（可选）
     * @param id 新品申请主键id（可选）
     * @return 新品申请信息
     * @throws HahaException 调用失败时抛出
     */
    public Map<String, Object> getNewGoodsInfo(String code, String id) throws HahaException {
        Map<String, String> params = new HashMap<>();
        params.put("access_token", client.getAccessToken());
        if (code != null && !code.isEmpty()) {
            params.put("code", code);
        }
        if (id != null && !id.isEmpty()) {
            params.put("id", id);
        }
        
        Map<String, Object> result = post("/goods/getNewClientGoodsInfo", params);
        return (Map<String, Object>) result.get("data");
    }
}
