package com.izouma.jiashanxia;

import com.izouma.jiashanxia.domain.BaseEntity;
import com.izouma.jiashanxia.domain.User;
import com.izouma.jiashanxia.web.BaseController;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.text.CaseUtils;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.junit.Test;
import org.reflections.ReflectionUtils;
import org.reflections.Reflections;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

import static java.nio.file.StandardOpenOption.CREATE;
import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING;

public class CommonTest {
    @Test
    public void getGenericsClass() {
        List<User> data = new ArrayList<>();
        data.add(new User());
        System.out.println(data.get(0).getClass().getSimpleName());
        System.out.println(data.getClass());


        Reflections reflections = new Reflections(this.getClass().getPackage().getName() + ".domain");
        Set<Class<? extends BaseEntity>> allClasses = reflections.getSubTypesOf(BaseEntity.class);
        for (Class<? extends BaseEntity> allClass : allClasses) {
            System.out.println(allClass.getName());
        }
    }

    @Test
    public void getapis() {
        List<Map<String, String>> entities = new ArrayList<>();
        Reflections classReflections = new Reflections(this.getClass().getPackage().getName());
        Set<Class<? extends BaseController>> controllers = classReflections.getSubTypesOf(BaseController.class);
        Set<Class<? extends BaseController>> list = ReflectionUtils
                .getAll(controllers, ReflectionUtils.withAnnotation(RestController.class));
        System.out.println(list);

        for (Class<? extends BaseController> aClass : list) {
            RequestMapping requestMapping = aClass.getAnnotation(RequestMapping.class);
            String baseUrl = requestMapping.value()[0];
            for (Method method : ReflectionUtils.getMethods(aClass, ReflectionUtils.withAnnotation(GetMapping.class))) {
                GetMapping getMapping = method.getAnnotation(GetMapping.class);
                System.out.println(getMapping.value()[0]);
            }
            for (Method method : ReflectionUtils
                    .getMethods(aClass, ReflectionUtils.withAnnotation(PostMapping.class))) {
                PostMapping postMapping = method.getAnnotation(PostMapping.class);
                System.out.println(postMapping.value()[0]);
            }
        }
    }

    @Test
    public void testCaseUtils() {
        System.out.println(CaseUtils.toCamelCase("test_Model", true, '_'));
    }

    @Test
    public void testMeasureText() throws IOException, FontFormatException {
        AffineTransform affinetransform = new AffineTransform();
        FontRenderContext frc = new FontRenderContext(affinetransform, true, true);
        Font font = Font.createFont(Font.TRUETYPE_FONT, this.getClass()
                .getResourceAsStream("/font/SourceHanSansCN-Normal.ttf"));
        System.out.println((int) (font.deriveFont(14f).getStringBounds("aaa", frc).getWidth()));
    }

    @Test
    public void testIdNoRegexp() {
        boolean b = Pattern
                .matches("^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0-2]\\d)|3[0-1])\\d{3}$|^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0-2]\\d)|3[0-1])\\d{3}[0-9xX]$", "32100219950830461X");
        System.out.println(b);
    }

    @Test
    public void tesSms() throws IOException {
        Reflections reflections = new Reflections(this.getClass().getPackage().getName() + ".enums");
        Set<Class<? extends Enum>> entitySet = reflections.getSubTypesOf(Enum.class);
        StringBuilder idxJs = new StringBuilder();
        for (Class<? extends Enum> entity : entitySet) {
            idxJs.append("import ").append(entity.getSimpleName()).append(" from \"./").append(entity.getSimpleName())
                    .append("\";\n");
            StringBuilder str = new StringBuilder("export default {\n");
            for (Enum enumConstant : entity.getEnumConstants()) {
                str.append("    ").append(enumConstant.name()).append(": \"").append(enumConstant.name())
                        .append("\",\n");
            }
            str.append("}");
            Files.write(Paths.get(System.getProperty("user.dir"), "src", "main", "vue", "src", "constants", entity
                    .getSimpleName() + ".js"), str.toString()
                    .getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
            Files.write(Paths.get(System.getProperty("user.dir"), "src", "main", "zmj_mp", "src", "constants", entity
                    .getSimpleName() + ".js"), str.toString()
                    .getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
        }
        idxJs.append("export default {\n");
        for (Class<? extends Enum> entity : entitySet) {
            idxJs.append("    ").append(entity.getSimpleName()).append(": ").append(entity.getSimpleName())
                    .append(",\n");
        }
        idxJs.append("}");
        System.out.println(idxJs.toString());
        Files.write(Paths
                .get(System.getProperty("user.dir"), "src", "main", "vue", "src", "constants", "index.js"), idxJs
                .toString().getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
        Files.write(Paths
                .get(System.getProperty("user.dir"), "src", "main", "zmj_mp", "src", "constants", "index.js"), idxJs
                .toString().getBytes(StandardCharsets.UTF_8), CREATE, TRUNCATE_EXISTING);
    }

    @Test
    public void gen() {
        System.out.println(RandomStringUtils.randomAlphabetic(32));
    }

    @Test
    public void password() {
        String password = new BCryptPasswordEncoder().encode("123456");

        System.out.println(password);
    }

    @Test
    public void testEnum() throws IOException {
        FFmpegFrameGrabber g = new FFmpegFrameGrabber("/Users/drew/Desktop/1.mp4");
        g.start();
        Frame frame = g.grab();
        Java2DFrameConverter converter = new Java2DFrameConverter();
        BufferedImage image = converter.convert(frame);
        ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
        ImageIO.write(image, "jpeg", new File("/Users/drew/Desktop/1.jpg"));
    }
}
