package com.bcxin.backend.tasks;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.bcxin.backend.domain.configs.FileModeConfig;
import com.bcxin.backend.core.AppConfigProperty;
import com.bcxin.backend.core.utils.ExceptionUtils;
import com.bcxin.backend.core.utils.FtpUtils;
import com.bcxin.backend.domain.syncs.repositories.DataSyncQueueLogRepository;
import com.bcxin.backend.domain.syncs.repositories.FileSyncQueueRepository;
import com.bcxin.runtime.domain.syncs.entities.FileSyncQueueEntity;
import com.bcxin.saas.core.components.JsonProvider;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Collection;

@Component
public class DownloadSyncFileJobTask extends TaskAbstract {
    private final FileSyncQueueRepository fileSyncQueueRepository;
    private final AppConfigProperty appConfigProperty;
    private final JsonProvider jsonProvider;

    public DownloadSyncFileJobTask(DataSyncQueueLogRepository dataSyncLogRepository,
                                   FileSyncQueueRepository fileSyncQueueRepository,
                                   AppConfigProperty appConfigProperty,
                                   JsonProvider jsonProvider) {
        this.fileSyncQueueRepository = fileSyncQueueRepository;
        this.appConfigProperty = appConfigProperty;
        this.jsonProvider = jsonProvider;
    }

    @Override
    protected void runCore() {
        Collection<FileSyncQueueEntity> fileSyncQueueEntities = null;
        Page<FileSyncQueueEntity> pagedFileSyncQueueEntities =
                this.fileSyncQueueRepository.getPendings(Pageable.ofSize(100));
        fileSyncQueueEntities = pagedFileSyncQueueEntities.getContent();

        log(String.format("鍏辨湁%s涓猟ata sync log寰呭鐞�;", fileSyncQueueEntities.size()));

        if (fileSyncQueueEntities.size() > 0) {
            for (FileSyncQueueEntity fileSyncQueueEntity : fileSyncQueueEntities) {
                try {
                    this.downloadFile(fileSyncQueueEntity);
                } catch (Exception ex) {
                    logger.error(String.format("id=%s; msg=%s", fileSyncQueueEntity.getId(), ex.toString()), ex);
                }
            }
            this.fileSyncQueueRepository.saveAll(fileSyncQueueEntities);
        }
    }

    @Override
    public String getTaskName() {
        return "sync.download.file";
    }

    private void downloadFile(FileSyncQueueEntity fileSyncQueueEntity) {
        StringBuilder sb = new StringBuilder("DownloadSyncFileJobTask.downloadFile;");
        boolean isSuccess = true;
        try {
            sb.append(String.format("鍑嗗涓嬭浇鏂囦欢璧勬簮: %s;", fileSyncQueueEntity.getDownloadUrl()));
            InputStream inputStream = new URL(fileSyncQueueEntity.getDownloadUrl()).openStream();
            boolean flag = checkUrlFileExists(inputStream);
            if (flag && FileModeConfig.getUseFtp()
//                    && fileSyncQueueEntity.getPath().indexOf("/uploads/item/") <0
                    && fileSyncQueueEntity.getPath().indexOf("/uploads/lib/") < 0) {
                sb.append(String.format("鍗冲皢涓婁紶鍒癋TP:%s", fileSyncQueueEntity.getPath()));

                isSuccess = FtpUtils.bcxUploadFile(FileModeConfig.getHost(),
                        FileModeConfig.getUserName(),
                        FileModeConfig.getPassword(),
                        FileModeConfig.getPort(),
                        (StrUtil.isEmpty(FileModeConfig.getFilePath()) ? "" : FileModeConfig.getFilePath()) + fileSyncQueueEntity.getPath(),
                        new URL(fileSyncQueueEntity.getDownloadUrl()).openStream());
            } else if (flag) {
                String destinationPath = appConfigProperty.getRootPath().concat(fileSyncQueueEntity.getPath());
                HttpUtil.downloadFile(fileSyncQueueEntity.getDownloadUrl(), destinationPath);
                sb.append(String.format("鍗冲皢涓嬭浇鍒�:%s", destinationPath));
                sb.append("瀹屾垚鏂囦欢涓嬭浇");
            } else {
                isSuccess = false;
                sb.append("鏂囦欢涓嬭浇澶辫触锛氬浘鐗囦笉瀛樺湪鎴栬€�0Kb");
            }
            log(sb.toString());
        } catch (Exception ex) {
            isSuccess = false;
            sb.insert(0, String.format("鏂囦欢涓嬭浇寮傚父: %s", ExceptionUtils.getStackMessage(ex)));
            throw new RuntimeException(sb.toString(), ex);
        } finally {
            logger.error(sb.toString());
            fileSyncQueueEntity.makeStatus(isSuccess, sb.toString());
        }
    }

    public boolean checkUrlFileExists(InputStream inputStream) {
        boolean flag = false;
        try {
            byte[] bytes = new byte[1024];
            if (inputStream.read(bytes) != -1) {
                flag = true;
            }
            return flag;
        } catch (Exception e) {
            return false;
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    logger.error("inputStream鍏虫祦寮傚父锛寋}", e);
                }
            }
        }
    }
}