package com.fastasyncworldedit.core.util;

import com.fastasyncworldedit.core.internal.io.FastByteArrayOutputStream;
import com.google.gson.Gson;
import com.google.gson.JsonObject;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.stream.Collectors;

public class ImgurUtility {

    public static final String CLIENT_ID = "50e34b65351eb07";

    public static URL uploadImage(File file) throws IOException {
        // was used until a merge deleted all the CFI/schematics functionality TODO NOT IMPLEMENTED
        return uploadImage(new FileInputStream(file));
    }

    public static URL uploadImage(InputStream inputStream) throws IOException {
        // was used until a merge deleted all the CFI/schematics functionality TODO NOT IMPLEMENTED
        inputStream = new BufferedInputStream(inputStream);
        FastByteArrayOutputStream baos = new FastByteArrayOutputStream(Short.MAX_VALUE);
        int i;
        while ((i = inputStream.read()) != -1) {
            baos.write(i);
        }
        baos.flush();
        return uploadImage(baos.toByteArray());
    }

    public static URL uploadImage(byte[] image) throws IOException {
        // was used until a merge deleted all the CFI/schematics functionality TODO NOT IMPLEMENTED
        String json = getImgurContent(CLIENT_ID, image);
        Gson gson = new Gson();
        JsonObject obj = gson.fromJson(json, JsonObject.class);
        JsonObject data = obj.get("data").getAsJsonObject();
        String link = data.get("link").getAsString();
        return new URL(link);
    }

    public static String getImgurContent(String clientID, byte[] image) throws IOException {
        String imageString = Base64.getEncoder().encodeToString(image);
        URL url = new URL("https://api.imgur.com/3/image");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        String data = URLEncoder.encode("image", StandardCharsets.UTF_8) + "=" + URLEncoder.encode(
                imageString,
                StandardCharsets.UTF_8
        );
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Authorization", "Client-ID " + clientID);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.connect();
        String stb;
        try (OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream())) {
            wr.write(data);
            wr.flush();
            try (BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
                stb = rd.lines().map(line -> line + "\n").collect(Collectors.joining());
            }
        }
        return stb;
    }

}
