import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

/**
 * SSCMFI Public API - Java Sample Code
 * Uses the built-in HttpClient available in Java 11 and later.
 */
public class SscmfiApiSample {

    public static void main(String[] args) {
        try {
            // 1. Configuration
            
            // --- Option A: Public API (No API Key required) ---
            String apiURL = "https://api.sscmfi.com/api/sscmfiPublicAPI";
            String apiKey = "";

            // --- Option B: Subscription API (Requires API Key) ---
            // String apiURL = "https://api.sscmfi.com/api/sscmfiAPICalculate";
            // String apiKey = "YOUR_API_KEY_HERE";

            // 2. Prepare the Request Payload (Minified JSON)
            // In professional projects, use a library like Jackson or Gson.
            String payload = "{" +
                "\"metadata\":{\"calculationID\":\"ABC987\"}," +
                "\"securityDefinition\":{" +
                    "\"securityID\":\"Testsec77\"," +
                    "\"paymentType\":\"Periodic\"," +
                    "\"securityType\":\"Corporate\"," +
                    "\"maturityDate\":\"3/31/2031\"," +
                    "\"couponRate\":8.75," +
                    "\"redemption_value\":100.0," +
                    "\"dayCountBasis\":\"SSCM30/360\"," +
                    "\"eomRule\":\"Adjust\"," +
                    "\"periodsPerYear\":\"Monthly\"," +
                    "\"callRedemptions\":{" +
                        "\"redemptionScheduleType\":\"Continuous with notification\"," +
                        "\"notifyMinDays\":30," +
                        "\"notifyMaxDays\":60," +
                        "\"notifyStart\":\"Trade date\"," +
                        "\"notifyCalendarBusiness\":\"Calendar days\"," +
                        "\"redemptionList\":[" +
                            "{\"date\":\"03/31/2027\",\"value\":101.50}," +
                            "{\"date\":\"09/30/2027\",\"value\":101.25}," +
                            "{\"date\":\"03/31/2028\",\"value\":101.0}," +
                            "{\"date\":\"09/03/2028\",\"value\":100.75}," +
                            "{\"date\":\"03/31/2029\",\"value\":100.50}," +
                            "{\"date\":\"09/30/2029\",\"value\":100.25}" +
                        "]" +
                    "}" +
                "}," +
                "\"tradeDefinition\":{" +
                    "\"tradeDate\":\"7/22/2025\"," +
                    "\"settlementDate\":\"7/23/2025\"," +
                    "\"givenType\":\"Price\"," +
                    "\"givenValue\":103.5" +
                "}," +
                "\"calculationSelection\":{" +
                    "\"calcsToReturn\":{" +
                        "\"calcPY\":\"Yes\"," +
                        "\"calcPYAnalytics\":\"Yes\"," +
                        "\"calcCFS\":\"No\"," +
                        "\"calcCFSAnalytics\":\"Yes\"," +
                        "\"calcCouponPeriod\":\"Yes\"" +
                    "}," +
                    "\"calculationsFor\":\"All redemptions\"" +
                "}," +
                "\"settings\":{" +
                    "\"dateScheme\":{" +
                        "\"dateTwoOrFourYear\":\"FOUR\"," +
                        "\"dateFormat\":\"MDY\"," +
                        "\"dateCutoffYear\":2075" +
                    "}" +
                "}" +
            "}";

            // 3. Initialize HttpClient and Build Request
            HttpClient client = HttpClient.newHttpClient();
            HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
                .uri(URI.create(apiURL))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(payload));

            if (!apiKey.isEmpty()) {
                requestBuilder.header("X-API-KEY", apiKey);
            }

            HttpRequest request = requestBuilder.build();

            // 4. Execute API Call
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

            // 5. Handle Response
            System.out.println("HTTP Status: " + response.statusCode());
            System.out.println("--------------------------------------------------");
            System.out.println(response.body());
            System.out.println("--------------------------------------------------");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
