import groovy.json.JsonSlurper
import groovy.json.JsonOutput
import javax.net.ssl.*
import java.security.cert.X509Certificate
import java.security.KeyStore

try {
    // 1. Get certificate from Apinizer Manager
    X509Certificate cert = environment_certificateMap.get("certificate-name")
    
    if (cert == null) {
        throw new Exception("Certificate not found: certificate-name")
    }
    
    // 2. Create KeyStore and add certificate
    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType())
    keyStore.load(null, null)
    keyStore.setCertificateEntry("domain.com", cert)
    
    // 3. Create TrustManagerFactory
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
    tmf.init(keyStore)
    
    // 4. Configure SSLContext securely
    SSLContext sslContext = SSLContext.getInstance("TLS")
    sslContext.init(null, tmf.getTrustManagers(), new java.security.SecureRandom())
    
    // 5. Set default SSL Socket Factory
    HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory())
    
    // 6. Hostname verification (recommended for production)
    HttpsURLConnection.setDefaultHostnameVerifier(HttpsURLConnection.getDefaultHostnameVerifier())
    
    // 7. Make API call
    String apiUrl = "https://your-api-endpoint.com/api/resource"
    URL url = new URL(apiUrl)
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection()
    
    // Request settings
    conn.setRequestMethod("GET") // or POST, PUT, DELETE
    conn.setRequestProperty("Accept", "application/json")
    conn.setRequestProperty("Content-Type", "application/json")
    conn.setUseCaches(false)
    
    // To add body for POST request:
    // conn.setDoOutput(true)
    // def requestBody = JsonOutput.toJson([key: "value"])
    // conn.getOutputStream().write(requestBody.getBytes("UTF-8"))
    
    // 8. Get response
    def statusCode = conn.getResponseCode()
    
    if (statusCode == 200) {
        def responseText = conn.getInputStream().getText("UTF-8")
        def jsonResponse = new JsonSlurper().parseText(responseText)
        
        // Process response
        requestHeaderMapToTargetAPI.put("status-code", statusCode)
        requestHeaderMapToTargetAPI.put("response", jsonResponse)
        
    } else {
        def errorText = conn.getErrorStream()?.getText("UTF-8") ?: "No error message"
        requestHeaderMapToTargetAPI.put("status-code", statusCode)
        requestErrorMessageToTargetAPI = "API Error: ${errorText}"
    }
    
    conn.disconnect()
    
} catch (Exception e) {
    requestErrorMessageToTargetAPI = "Error occurred: ${e.getMessage()}"
    // For detailed error logging
    // e.printStackTrace()
}
GROOVY