// Jeton client_credentials puis lecture d'une page de factures — Java 17+ (java.net.http).
// client_credentials token, then one page of invoices — Java 17+ (java.net.http).
// Pour un vrai projet, analyser le JSON avec Jackson ou Gson ; ici on affiche la réponse brute.
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public final class ClientCredentials {
    static final String API_BASE = "https://api.tauraco.io/public/v1";
    static final String TOKEN_URL = "https://api.tauraco.io/oauth/token";
    private static final Pattern ACCESS_TOKEN = Pattern.compile("\"access_token\"\\s*:\\s*\"([^\"]+)\"");

    private ClientCredentials() {}

    static String form(String... pairs) {
        StringBuilder out = new StringBuilder();
        for (int i = 0; i < pairs.length; i += 2) {
            if (out.length() > 0) out.append('&');
            out.append(URLEncoder.encode(pairs[i], StandardCharsets.UTF_8)).append('=')
               .append(URLEncoder.encode(pairs[i + 1], StandardCharsets.UTF_8));
        }
        return out.toString();
    }

    static String token(HttpClient http, String clientId, String clientSecret, String scope) throws Exception {
        String basic = Base64.getEncoder().encodeToString((clientId + ":" + clientSecret).getBytes(StandardCharsets.UTF_8));
        HttpRequest request = HttpRequest.newBuilder(URI.create(TOKEN_URL))
            .header("Authorization", "Basic " + basic)
            .header("Content-Type", "application/x-www-form-urlencoded")
            .POST(HttpRequest.BodyPublishers.ofString(form(
                "grant_type", "client_credentials", "scope", scope, "resource", API_BASE)))
            .build();
        HttpResponse<String> response = http.send(request, HttpResponse.BodyHandlers.ofString());
        Matcher matcher = ACCESS_TOKEN.matcher(response.body());
        if (response.statusCode() != 200 || !matcher.find()) {
            throw new IllegalStateException("jeton refusé : HTTP " + response.statusCode());
        }
        return matcher.group(1);
    }

    public static void main(String[] args) throws Exception {
        HttpClient http = HttpClient.newHttpClient();
        String token = token(http, System.getenv("TAURACO_CLIENT_ID"), System.getenv("TAURACO_CLIENT_SECRET"), "invoices:read");
        HttpRequest list = HttpRequest.newBuilder(URI.create(API_BASE + "/invoices?status=PAID&limit=100"))
            .header("Authorization", "Bearer " + token)
            .header("Accept", "application/json")
            .GET().build();
        HttpResponse<String> page = http.send(list, HttpResponse.BodyHandlers.ofString());
        // Corps : {"data":[{"number":…,"customer_name":…,"total":"1180000","currency":"XOF"}],"next_cursor":…,"has_more":…}
        System.out.println(page.statusCode() + " " + page.body());
    }
}
