/**
 * Copyright (c) 2021 Eclipse contributors and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 */
package org.eclipse.justj.codegen.model.util;


import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;


public class TemurinIndexer
{

  static final Pattern TAG_NAME = Pattern.compile("\"name\"\\s*:\\s*\"(jdk-([0-9]+)(?:\\.([0-9]+))(?:\\.([0-9]+))(?:\\.([0-9]+))?\\+([0-9]+))\"");

  static final Pattern JDK_URL1 = Pattern.compile(
    "href=\"/adoptium/temurin([0-9]+)-binaries/releases/download/jdk-([0-9]+)%2B35/OpenJDK([0-9]+)-jdk_([^_]+)_([^_]+)_hotspot_([0-9.]+)\\.(tar.gz|zip)\"");

  static final Pattern JDK_URL = Pattern.compile(//
    "href=\"/(adoptium/temurin[0-9]+-binaries/releases/download/jdk-[^/]+/OpenJDK[^-]+-jdk_[^\"]*\\.(zip|tar.gz))\"");

  public static void main(String[] args) throws Exception
  {
    System.out.println("// Generated by /org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/TemurinIndexer.java");

    for (String repo : new String []{ "11", "17" })
    {
      URL url = new URL("https://api.github.com/repos/adoptium/temurin" + repo + "-binaries/tags");
      try (InputStream input = url.openStream())
      {
        List<String> lines = new BufferedReader(new InputStreamReader(input)).lines().collect(Collectors.toList());
        Map<Long, String> versionTags = new TreeMap<>(Comparator.reverseOrder());
        for (String line : lines)
        {
          for (Matcher matcher = TAG_NAME.matcher(line); matcher.find();)
          {
            long version = Integer.parseInt(matcher.group(2));
            version = 1000L * version + Integer.parseInt(matcher.group(3));
            version = 100L * version + Integer.parseInt(matcher.group(4));
            if (matcher.group(5) != null)
            {
              version = 100L * version + Integer.parseInt(matcher.group(5));
            }
            else
            {
              version = 100L * version;
            }
            version = 100L * version + Integer.parseInt(matcher.group(6));
            versionTags.put(version, matcher.group(1));
          }
        }

        System.out.println();
        System.out.println("// Tags " + versionTags.values().stream().collect(Collectors.joining(", ")));

        String latest = versionTags.entrySet().iterator().next().getValue();
        URL downloadsURL = new URL("https://github.com/adoptium/temurin" + repo + "-binaries/releases/tag/" + latest);
        List<String> jdkDownloadURLs = new ArrayList<>();
        try (InputStream download = downloadsURL.openStream())
        {
          List<String> downloads = new BufferedReader(new InputStreamReader(download)).lines().collect(Collectors.toList());
          for (String downloadLine : downloads)
          {
            for (Matcher matcher = JDK_URL.matcher(downloadLine); matcher.find();)
            {
              jdkDownloadURLs.add("https://github.com/" + matcher.group(1).replace("%2B", "+"));
            }
          }
        }

        System.out.println("def java" + repo + "Adoptium = [");
        System.out.println("  label: 'Java " + repo + " (Adoptium)',");
        System.out.println("  BUILD_DESCRIPTION: 'Build Adoptium Java " + repo + "',");
        System.out.println("  PUBLISH_LOCATION_PREFIX: \"${defaultPrefix}\",");
        System.out.println("  JUSTJ_MANIFEST_URL: \"${justjURL}/${defaultPrefix}/" + repo + "/downloads/latest/justj.manifest\",");
        System.out.println("  JDK_URLS_WINDOWS: '''");
        {
          String jdkURL = getURL(jdkDownloadURLs, "x64_windows");
          if (jdkURL != null)
          {
            System.out.println("    " + jdkURL);
          }
        }
        System.out.println("    ''',");

        System.out.println("  JDK_URLS_MACOS: '''");
        {
          String jdkURL = getURL(jdkDownloadURLs, "x64_mac");
          if (jdkURL != null)
          {
            System.out.println("    " + jdkURL);
          }
        }
        System.out.println("    ''',");

        System.out.println("  JDK_URLS_MACOS_AARCH64: '''");
        {
          String jdkURL = getURL(jdkDownloadURLs, "aarch64_mac");
          if (jdkURL != null)
          {
            System.out.println("    " + jdkURL);
          }
        }
        System.out.println("    ''',");

        System.out.println("  JDK_URLS_LINUX: '''");
        {
          String jdkURL = getURL(jdkDownloadURLs, "x64_linux");
          if (jdkURL != null)
          {
            System.out.println("    " + jdkURL);
          }
        }
        System.out.println("    ''',");

        System.out.println("  JDK_URLS_LINUX_AARCH64: '''");
        {
          String jdkURL = getURL(jdkDownloadURLs, "aarch64_linux");
          if (jdkURL != null)
          {
            System.out.println("    " + jdkURL);
          }
        }
        System.out.println("    ''',");

        System.out.println("  BUILD_TYPE: 'nightly',");
        System.out.println("  PROMOTE: 'true'");
        System.out.println("]");
      }
    }
  }

  private static String getURL(List<String> downloadURLs, String type)
  {
    for (String downloadURL : downloadURLs)
    {
      if (downloadURL.contains(type))
      {
        return downloadURL;
      }
    }

    return null;
  }
}
