package iot.lidee.iot.service.impl;

import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import iot.lidee.iot.domain.Device;
import iot.lidee.iot.mapper.bygz.ByManagementJlMapper;
import iot.lidee.iot.mapper.bygz.DevGzbxWxgdMapper;
import iot.lidee.iot.model.bygz.ByManagementJl;
import iot.lidee.iot.model.bygz.DevGzbxWxgdDO;
import iot.lidee.iot.model.bygz.SyncDataContainer;
import iot.lidee.iot.service.IDeviceDataLoadService;
import iot.lidee.iot.service.IDeviceDataSyncService;
import iot.lidee.iot.service.IDeviceMaintenanceRepairService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class DeviceMaintenanceRepairServiceImpl implements IDeviceMaintenanceRepairService {

    private static final Logger logger = LoggerFactory.getLogger(DeviceMaintenanceRepairServiceImpl.class);


    @Resource
    private IDeviceDataLoadService loadService;

    @Resource
    private IDeviceDataSyncService syncService;

    @Resource
    private ByManagementJlMapper byManagementJlMapper;

    @Resource
    private DevGzbxWxgdMapper devGzbxWxgdMapper;


    /**
     * 同步设备维修保养信息
     * 从源数据库加载设备维修保养相关数据并同步到主数据库，使用事务保证数据一致性
     * 同步过程包括：加载源数据、同步到主库两个阶段
     */
    @Override
    @DSTransactional
    public void syncDeviceMaintenanceRepairInfo() {
        logger.info("开始同步设备维修保养信息");
        
        try {
            // 加载源数据
            SyncDataContainer syncData = loadService.loadData();
            
            // 同步数据到主数据库
            syncService.syncDataToMaster(syncData);

            logger.info("设备维修保养信息同步完成");
        } catch (Exception e) {
            logger.error("同步设备维修保养信息失败", e);
            throw new RuntimeException("同步设备维修保养信息失败: " + e.getMessage(), e);
        }
    }

    /**
     * 查询保养记录列表
     * 根据设备类型查询对应的保养记录信息
     * 
     * @param devtype 设备类型
     * @return 保养记录列表
     */
    @Override
    public List<ByManagementJl> maintenanceList(String devtype) {
        return byManagementJlMapper.selectBygdByType(devtype);
    }

    /**
     * 查询维修工单列表
     * 根据设备类型查询对应的维修工单信息
     * 
     * @param devtype 设备类型
     * @return 维修工单列表
     */
    @Override
    public List<DevGzbxWxgdDO> repairList(String devtype) {
        return devGzbxWxgdMapper.selectWxgdByType(devtype);
    }

    /**
     * 查询设备列表
     * 根据设备类型查询对应的设备信息
     * 
     * @param devtype 设备类型
     * @return 设备列表
     */
    @Override
    public List<Device> deviceList(String devtype) {
        List<Device> devices = devGzbxWxgdMapper.deviceList(devtype);

        for (Device device : devices) {
            device.setLogs(devGzbxWxgdMapper.deviceLogList(device.getSerialNumber()));
        }
        return devices;
    }
}