package com.dji.sample.storage.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.dji.sample.component.oss.model.OssConfiguration;
import com.dji.sample.component.oss.service.impl.OssServiceContext;
import com.dji.sample.manage.model.dto.DeviceDTO;
import com.dji.sample.manage.model.entity.DeviceEntity;
import com.dji.sample.manage.service.IDeviceRedisService;
import com.dji.sample.manage.service.IDeviceService;
import com.dji.sample.storage.service.IStorageService;
import com.dji.sdk.cloudapi.media.StorageConfigGet;
import com.dji.sdk.cloudapi.media.api.AbstractMediaService;
import com.dji.sdk.cloudapi.storage.StsCredentialsResponse;
import com.dji.sdk.mqtt.MqttReply;
import com.dji.sdk.mqtt.requests.TopicRequestsRequest;
import com.dji.sdk.mqtt.requests.TopicRequestsResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.MessageHeaders;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Optional;

/**
 * @author sean
 * @version 0.3
 * @date 2022/3/9
 */
@Service
public class StorageServiceImpl extends AbstractMediaService implements IStorageService {

    @Autowired
    private OssServiceContext ossService;

    @Autowired
    private IDeviceRedisService deviceRedisService;

    @Autowired
    private IDeviceService deviceService;

    @Override
    public StsCredentialsResponse getSTSCredentials() {
        return new StsCredentialsResponse()
                .setEndpoint(OssConfiguration.endpoint)
                .setBucket(OssConfiguration.bucket)
                .setCredentials(ossService.getCredentials())
                .setProvider(OssConfiguration.provider.toClientProvider())
                .setObjectKeyPrefix(OssConfiguration.objectDirPrefix)
                .setRegion(OssConfiguration.region);
    }

    @Override
    public StsCredentialsResponse getSTSCredentials(String workspaceId) {
        return new StsCredentialsResponse()
                .setEndpoint(OssConfiguration.endpoint)
                .setBucket(OssConfiguration.bucket)
                .setCredentials(ossService.getCredentials())
                .setProvider(OssConfiguration.provider.toClientProvider())
                .setObjectKeyPrefix(OssConfiguration.objectDirPrefix + "/" + workspaceId)
                .setRegion(OssConfiguration.region);
    }

    @Override
    public TopicRequestsResponse<MqttReply<StsCredentialsResponse>> storageConfigGet(TopicRequestsRequest<StorageConfigGet> response, MessageHeaders headers) {

        String gateWay = response.getGateway();
        Optional<DeviceDTO> deviceOnline = deviceRedisService.getDeviceOnline(gateWay);
        String workspaceId = null;
        if (deviceOnline.isPresent()) {
            workspaceId = deviceOnline.get().getWorkspaceId();
        } else {
            List<DeviceEntity> deviceEntities = deviceService.list(new LambdaQueryWrapper<DeviceEntity>().eq(DeviceEntity::getDeviceSn, gateWay));
            if (!CollectionUtils.isEmpty(deviceEntities)) {
                workspaceId = deviceEntities.get(0).getWorkspaceId();
            }
        }
        StsCredentialsResponse stsCredentials;
        if (StringUtils.hasText(workspaceId)) {
            stsCredentials  = getSTSCredentials(workspaceId);
        } else {
            stsCredentials = getSTSCredentials();
        }

        return new TopicRequestsResponse<MqttReply<StsCredentialsResponse>>().setData(MqttReply.success(stsCredentials));
    }
}
