<?php
/**
 * EmailTrackingApiClient.php
 * -----------------------------------------------------------------------------
 * PCL/WPL Email Tracking API Client - FINAL OLD ROUTES
 * -----------------------------------------------------------------------------
 * Purpose:
 * - Posts tracking payloads to PCL V15 API.
 * - Uses old/live routes that are confirmed working:
 *   /email/track/otp
 *   /email/track/legacy-call
 *   /email/track/journey
 * - Supports full rendered email storage:
 *   full_email_html
 *   full_email_text
 *   payload_json
 *   response_json
 * -----------------------------------------------------------------------------
 */

class EmailTrackingApiClient
{
    const API_BASE = 'https://www.procorporateleague.com/pcl_rest/api/v15';

    const OTP_TRACKING_API_URL     = self::API_BASE . '/email/track/otp';
    const LEGACY_TRACKING_API_URL  = self::API_BASE . '/email/track/legacy-call';
    const JOURNEY_TRACKING_API_URL = self::API_BASE . '/email/track/journey';

    /**
     * Enable only while debugging. Production email sending must not fail because tracking failed.
     */
    const DEBUG = false;

    public static function trackOtp(array $payload)
    {
        return self::post(self::OTP_TRACKING_API_URL, self::normalizePayload($payload, 'otp'));
    }

    public static function trackLegacy(array $payload)
    {
        return self::post(self::LEGACY_TRACKING_API_URL, self::normalizePayload($payload, 'legacy'));
    }

    public static function trackJourney(array $payload)
    {
        return self::post(self::JOURNEY_TRACKING_API_URL, self::normalizePayload($payload, 'journey'));
    }

    /**
     * Backward compatible alias. Existing files calling EmailTrackingApiClient::log()
     * will now log as a legacy email send record.
     */
    public static function log(array $payload)
    {
        return self::trackLegacy($payload);
    }

    private static function post($url, array $payload)
    {
        $jsonPayload = json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);

        $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      => $jsonPayload,
            CURLOPT_CONNECTTIMEOUT  => 5,
            CURLOPT_TIMEOUT         => 10,
            CURLOPT_SSL_VERIFYPEER  => true,
            CURLOPT_SSL_VERIFYHOST  => 2,
        ]);

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

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

        if (self::DEBUG || !empty($payload['debug_tracking'])) {
            return $result;
        }

        return [
            'tracking_status' => $result['tracking_status'],
            'http_code'       => $httpCode,
        ];
    }

    private static function normalizePayload(array $payload, $type = 'legacy')
    {
        $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['public_calling_url']= $payload['public_calling_url']?? self::currentUrl();
        $payload['calling_page_url']  = $payload['calling_page_url']  ?? self::currentUrl();
        $payload['server_full_path']  = $payload['server_full_path']  ?? ($_SERVER['SCRIPT_FILENAME'] ?? null);
        $payload['server_file_path']  = $payload['server_file_path']  ?? ($_SERVER['SCRIPT_FILENAME'] ?? null);
        $payload['parent_domain']     = $payload['parent_domain']     ?? ($_SERVER['HTTP_HOST'] ?? 'wplspeedqueen.com');
        $payload['parent_project']    = $payload['parent_project']    ?? 'WPL Speed Queen Email API';
        $payload['created_from']      = $payload['created_from']      ?? 'EmailTrackingApiClient';
        $payload['tracking_type']     = $payload['tracking_type']     ?? $type;

        if (!isset($payload['active_file_name']) && !empty($_SERVER['SCRIPT_FILENAME'])) {
            $payload['active_file_name'] = basename($_SERVER['SCRIPT_FILENAME']);
        }

        // Normalize full email content aliases.
        if (!isset($payload['full_email_html'])) {
            foreach (['email_html', 'rendered_html', 'html_body', 'body_html', 'mail_body'] as $key) {
                if (!empty($payload[$key])) {
                    $payload['full_email_html'] = $payload[$key];
                    break;
                }
            }
        }

        if (!isset($payload['full_email_text'])) {
            foreach (['email_text', 'plain_text', 'text_body', 'body_text'] as $key) {
                if (!empty($payload[$key])) {
                    $payload['full_email_text'] = $payload[$key];
                    break;
                }
            }
        }

        if (!isset($payload['full_email_text']) && !empty($payload['full_email_html'])) {
            $payload['full_email_text'] = trim(preg_replace('/\s+/', ' ', strip_tags($payload['full_email_html'])));
        }

        // Store complete outbound tracking request in payload_json if caller did not provide it.
        if (!isset($payload['payload_json'])) {
            $copy = $payload;
            if (isset($copy['full_email_html'])) {
                $copy['full_email_html_length'] = strlen((string)$copy['full_email_html']);
                unset($copy['full_email_html']);
            }
            $payload['payload_json'] = json_encode(self::maskSensitiveRecursive($copy), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        } elseif (is_array($payload['payload_json'])) {
            $payload['payload_json'] = json_encode(self::maskSensitiveRecursive($payload['payload_json']), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        }

        return self::maskSensitiveRecursive($payload);
    }

    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/';
        return $scheme . '://' . $host . $uri;
    }

    private static function maskSensitiveRecursive($value)
    {
        if (is_array($value)) {
            foreach ($value as $key => $item) {
                $lower = strtolower((string)$key);
                if (in_array($lower, ['otp', 'password', 'smtp_password', 'app_password', 'token', 'secret'], true)) {
                    $value[$key] = self::maskValue($item);
                } else {
                    $value[$key] = self::maskSensitiveRecursive($item);
                }
            }
        }
        return $value;
    }

    private static function maskValue($value)
    {
        $value = (string)$value;
        if ($value === '') return '';
        if (strlen($value) <= 2) return '******';
        return substr($value, 0, 1) . '****' . substr($value, -1);
    }
}
