package com.haha.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.haha.entity.LayerTemplate;
import com.haha.common.dto.LayerTemplateCreateDTO;
import com.haha.common.dto.LayerTemplateUpdateDTO;

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

/**
 * 设备设备层模版管理服务接口
 * 提供设备层模版的CRUD操作和同步功能
 *
 * @author haha-service
 * @version 1.0.0
 */
public interface LayerTemplateService extends IService<LayerTemplate> {

    /**
     * 分页查询设备模版列表
     *
     * @param page         页码（从1开始）
     * @param pageSize     每页条数
     * @param deviceId     设备ID（可选，模糊查询）
     * @param syncStatus   同步状态（可选）：0-未同步，1-同步中，2-已同步，3-同步失败
     * @param templateName 模板名称（可选，模糊查询）
     * @param templateType 模版类型（可选）：LAYER-层模版, CABINET-柜模版
     * @return 分页结果
     */
    IPage<LayerTemplate> getPage(int page, int pageSize, String deviceId, Integer syncStatus, String templateName, String templateType);

    /**
     * 获取层模版详情（带标签填充）
     *
     * @param id 层模版ID
     * @return 层模版详情（包含展示字段）
     */
    LayerTemplate getDetailById(Long id);

    /**
     * 根据设备ID获取层模版
     *
     * @param deviceId 设备ID（SN号）
     * @return 层模版信息，不存在则返回null
     */
    LayerTemplate getByDeviceId(String deviceId);

    /**
     * 创建层模版
     *
     * @param dto 创建请求DTO
     * @return 创建后的层模版
     */
    LayerTemplate create(LayerTemplateCreateDTO dto);

    /**
     * 更新层模版
     *
     * @param id  层模版ID
     * @param dto 更新请求DTO
     * @return 更新后的层模版
     */
    LayerTemplate update(Long id, LayerTemplateUpdateDTO dto);

    /**
     * 软删除层模版
     *
     * @param id 层模版ID
     * @return 是否成功
     */
    boolean softDelete(Long id);

    /**
     * 从哈哈平台同步单个设备层模版
     * 将哈哈平台的层模版数据拉取到本地数据库
     *
     * @param deviceId 设备ID（SN号）
     * @return 是否成功
     */
    boolean syncFromHaha(String deviceId);

    /**
     * 批量同步设备层模版
     * 支持批量从哈哈平台同步多个设备的层模版数据
     *
     * @param deviceIds 设备ID列表
     * @return 同步结果统计信息
     */
    Map<String, Object> batchSync(List<String> deviceIds);

    /**
     * 获取设备商品配置（转换为前端格式）
     *
     * @param deviceId 设备编号
     * @return 商品配置数据，包含floors列表
     */
    Map<String, Object> getProductConfig(String deviceId);

    /**
     * 获取设备商品陈列信息（小程序首页使用）
     * 返回左右门层数据和设备基础信息，供小程序展示柜内商品
     *
     * @param deviceId 设备ID（SN号）
     * @return 包含 templateName、deviceId、shelfNum、deviceType、leftFloors、rightFloors 的Map
     */
    Map<String, Object> getDeviceProducts(String deviceId);

    /**
     * 保存设备商品配置
     *
     * @param deviceId 设备编号
     * @param floors   楼层配置数据（前端格式）
     * @return 是否成功
     */
    boolean saveProductConfig(String deviceId, List<Map<String, Object>> floors);
}
