package com.izouma.nineth.service;

import com.alibaba.fastjson.JSON;
import com.izouma.nineth.ApplicationTests;
import com.izouma.nineth.domain.BlindBoxItem;
import com.izouma.nineth.domain.Collection;
import com.izouma.nineth.domain.FileObject;
import com.izouma.nineth.dto.CreateBlindBox;
import com.izouma.nineth.enums.CollectionType;
import com.izouma.nineth.exception.BusinessException;
import com.izouma.nineth.repo.CollectionRepo;
import com.izouma.nineth.repo.PrivilegeOptionRepo;
import com.izouma.nineth.repo.UserRepo;
import com.izouma.nineth.service.storage.StorageService;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

class CollectionServiceTest extends ApplicationTests {

    @Autowired
    private CollectionService   collectionService;
    @Autowired
    private CollectionRepo      collectionRepo;
    @Autowired
    private StorageService      storageService;
    @Autowired
    private UserRepo            userRepo;
    @Autowired
    private PrivilegeOptionRepo privilegeOptionRepo;
    @Autowired
    private SysConfigService    sysConfigService;

    @Test
    void toDTO() {
        Collection collection = collectionRepo.findById(951L).get();
        assert collection.getPic() != null;
    }

    @Test
    public void batchUpload() throws IOException {
        AtomicInteger num = new AtomicInteger(2501);
        List<BlindBoxItem> items = new ArrayList<>();
        String jsonStr = FileUtils.readFileToString(new File("/Users/qiufangchao/Desktop/evo.json"), "UTF-8");
        Arrays.stream(new File("/Users/qiufangchao/Desktop/evo3").listFiles())
                .filter(f -> Pattern.matches("^BJ.*\\.png$", f.getName()))
                .parallel().forEach(file -> {
                    try {
                        Collection collection = JSON.parseObject(jsonStr, Collection.class);
                        collection.setId(null);
                        collection.setName(String.format("OASISPUNK.EVO #%04d", num.getAndIncrement()));
                        collection.setStock(1);
                        collection.setTotal(1);
                        collection.setSale(0);
                        collection.setMinterId(7150L);
                        collection.setOnShelf(false);
                        collection.setSalable(false);
                        collection.setPic(Collections.singletonList(new FileObject("", "https://raex-meta.oss-cn-shenzhen.aliyuncs.com/image/evos3/" + file.getName(), null, "png")));

                        collectionRepo.save(collection);
                        System.out.println("保存成功" + collection.getId());

                        items.add(BlindBoxItem
                                .builder()
                                .collectionId(collection.getId())
                                .total(1)
                                .stock(1)
                                .rare(false)
                                .build());
                    } catch (Exception e) {
                    }
                });


    }

    @Test
    public void createBlindBox() throws IOException {
        List<Collection> items = collectionRepo.findByNameLike("OASISPUNK.EVO #%").stream().filter(i -> {
            int num = Integer.parseInt(i.getName().substring("OASISPUNK.EVO #".length()));
            return num > 2500 && num <= 3000;
        }).collect(Collectors.toList());

        String jsonStr = FileUtils.readFileToString(new File("/Users/qiufangchao/Desktop/evo.json"), "UTF-8");
        Collection blindBox = JSON.parseObject(jsonStr, Collection.class);
        blindBox.setType(CollectionType.BLIND_BOX);
        blindBox.setId(null);
        blindBox.setOnShelf(false);
        blindBox.setSalable(false);
        blindBox.setMinterId(7150L);
        blindBox.setNoSoldOut(true);
        blindBox.setName("OASISPUNK.EVO绿洲朋克进化版限定盲盒S3");
        blindBox.setPic(Arrays.asList(new FileObject(null, "https://raex-meta.oss-cn-shenzhen.aliyuncs.com/image/evos3/fm.jpg", null, null)));
        collectionService.createBlindBox(new CreateBlindBox(blindBox, items.stream().map(i -> {
            BlindBoxItem item = new BlindBoxItem();
            item.setCollectionId(i.getId());
            item.setTotal(1);
            return item;
        }).collect(Collectors.toList())));

    }

    public FileObject uploadFile(File file) throws IOException {
        String ext = Optional.of(FilenameUtils.getExtension(file.getName())).orElse("")
                .toLowerCase().replace("jpeg", "jpg");
        String basePath = Optional.ofNullable(Files.probeContentType(file.toPath())).orElse("application")
                .split("/")[0];
        String path = basePath + "/" + new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date())
                + RandomStringUtils.randomAlphabetic(8)
                + "." + ext;
        return new FileObject("", storageService.uploadFromInputStream(new FileInputStream(file), path), null, ext);
    }

    @Test
    public void test1() {
        Long collectionId = 2570204L;
        Collection collection = collectionRepo.findById(collectionId).orElseThrow(new BusinessException("无藏品"));
        if (!collection.isOnShelf() || !collection.isSalable()) {
            collectionId = null;
        } else if (collection.isScheduleSale()) {
            if (collection.getStartTime().isAfter(LocalDateTime.now())) {
                collectionId = null;
            }
        }
        System.out.println(collectionId);
    }

    @Test
    public void savePoint() {
//        collectionRepo.findById(206985L).orElseThrow(new BusinessException("无藏品"));
        collectionService.savePoint(3749128L, LocalDateTime.of(2022, 3, 23, 15, 0, 0));
    }

}