package com.sourcefellows.resillience;

import io.github.resilience4j.core.IntervalFunction;
import io.github.resilience4j.core.functions.CheckedSupplier;
import io.github.resilience4j.retry.Retry;
import io.github.resilience4j.retry.RetryConfig;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Main {

    public static void main(String[] args) throws Throwable {

        // Backoff-Intervall Konfiguration
        IntervalFunction intervalWithExponentialBackoff = IntervalFunction
                .ofExponentialBackoff(IntervalFunction.DEFAULT_INITIAL_INTERVAL);

        // Konfiguration für den Retry-Mechanismus
        RetryConfig config = RetryConfig.<String>custom()
                // maximale Wiederholungszahl
                .maxAttempts(2)
                // Backoff-Konfiguration
                .intervalFunction(intervalWithExponentialBackoff)
                // Wiederholung bei bestimmten Ergebnissen
                .retryOnResult(response -> response.equals("error"))
                // Exceptions, die zu einem Retry führen sollen
                .retryExceptions(IOException.class, TimeoutException.class)
                // Exceptions, die für Retry ignoriert werden sollen
                .ignoreExceptions(BusinessException.class)
                .build();

        Retry retry = Retry.of("helloworld", config);

        // Aufzurufender Service
        HelloWorldService helloWorldService = new HelloWorldService();

        // Erstellen eines dekorierten Service mit Retry-Funktionalität
        CheckedSupplier<String> supplier = Retry
                .decorateCheckedSupplier(retry, helloWorldService::sayHelloWorld);

        // Aufruf des Service über den "Dekorator"
        String result = supplier.get();

    }

}
