<?php
/**
 * EmailTrackingApiClient.php
 * -----------------------------------------------------------------------------
 * WPL Speed Queen email tracking client.
 *
 * IMPORTANT:
 * - No database credentials are stored on WPL server.
 * - This helper only posts tracking payloads to the PCL V15 API.
 * - Existing email files should include this helper after sending/failing email.
 * -----------------------------------------------------------------------------
 */

class EmailTrackingApiClient
{
    /**
     * PCL V15 tracking route. DB insert happens inside ProCorporateLeague API only.
     */
    const TRACKING_API_URL = 'https://www.procorporateleague.com/pcl_rest/api/v15/email/track/otp';
    const LEGACY_TRACKING_API_URL = 'https://www.procorporateleague.com/pcl_rest/api/v15/email/track/legacy-call';

    /**
     * Set true only while debugging tracking API connectivity.
     * Keep false in production so email sending is never blocked by tracking failure.
     */
    const DEBUG = true; // TEMP: keep true until dashboard shows rows

    /**
     * Send tracking payload to PCL API.
     *
     * @param array $payload
     * @return array
     */
    public static function log(array $payload)
    {
        $safePayload = self::normalizePayload($payload);

        // OTP endpoint inserts into email_otp_tracking.
        $otpResult = self::postJson(self::TRACKING_API_URL, $safePayload);

        // Legacy endpoint inserts into email_send_logs and email_journey_events for dashboard.
        $legacyResult = self::postJson(self::LEGACY_TRACKING_API_URL, $safePayload);

        $overallStatus = (
            $otpResult['tracking_status'] === 'success' ||
            $legacyResult['tracking_status'] === 'success'
        ) ? 'success' : 'failed';

        $result = [
            'tracking_status' => $overallStatus,
            'otp_endpoint' => $otpResult,
            'legacy_endpoint' => $legacyResult,
        ];

        if (self::DEBUG) {
            return $result;
        }

        return [
            'tracking_status' => $overallStatus,
            'otp_http_code' => $otpResult['http_code'],
            'legacy_http_code' => $legacyResult['http_code'],
        ];
    }

    private static function postJson($url, array $safePayload)
    {
        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_POST            => true,
            CURLOPT_RETURNTRANSFER  => true,
            CURLOPT_HTTPHEADER      => [
                'Content-Type: application/json',
                'Accept: application/json'
            ],
            CURLOPT_POSTFIELDS      => json_encode($safePayload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
            CURLOPT_CONNECTTIMEOUT  => 5,
            CURLOPT_TIMEOUT         => 12,

            // TEMP: helps shared hosting diagnose CA bundle issues. Turn back on after confirmed.
            CURLOPT_SSL_VERIFYPEER  => false,
            CURLOPT_SSL_VERIFYHOST  => 0,
        ]);

        $responseBody = curl_exec($ch);
        $curlError    = curl_error($ch);
        $httpCode     = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        return [
            'tracking_status' => ($curlError === '' && $httpCode >= 200 && $httpCode < 300) ? 'success' : 'failed',
            'http_code'       => $httpCode,
            'response'        => $responseBody,
            'error'           => $curlError,
            'url'             => $url,
        ];
    }

    /**

     * Normalize common fields and add source details.
     *
     * @param array $payload
     * @return array
     */
    private static function normalizePayload(array $payload)
    {
        $payload['source_type']       = $payload['source_type']       ?? 'legacy_wpl_email_api';
        $payload['source_key']        = $payload['source_key']        ?? 'wplspeedqueen_email_api';
        $payload['direct_email_url']  = $payload['direct_email_url']  ?? self::currentUrl();
        $payload['server_file_path']  = $payload['server_file_path']  ?? ($_SERVER['SCRIPT_FILENAME'] ?? null);
        $payload['parent_domain']     = $payload['parent_domain']     ?? 'wplspeedqueen.com';
        $payload['parent_project']    = $payload['parent_project']    ?? 'WPL Speed Queen Email API';
        $payload['created_from']      = $payload['created_from']      ?? 'EmailTrackingApiClient';

        // Ensure sensitive fields are masked before sending to tracking API.
        if (isset($payload['payload_json']['otp'])) {
            $payload['payload_json']['otp'] = self::maskOtp($payload['payload_json']['otp']);
        }
        if (isset($payload['request_payload']['otp'])) {
            $payload['request_payload']['otp'] = self::maskOtp($payload['request_payload']['otp']);
        }

        return $payload;
    }

    /**
     * Return current full URL where possible.
     */
    private static function currentUrl()
    {
        $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
        $host   = $_SERVER['HTTP_HOST'] ?? 'wplspeedqueen.com';
        $uri    = $_SERVER['REQUEST_URI'] ?? '/email_api/sendOtp.php';
        return $scheme . '://' . $host . $uri;
    }

    /**
     * Mask OTP for tracking logs.
     */
    private static function maskOtp($otp)
    {
        $otp = (string) $otp;
        if (strlen($otp) <= 2) {
            return '******';
        }
        return substr($otp, 0, 1) . '****' . substr($otp, -1);
    }
}
