<?php
/**
 * Plugin Name: FX Salesforce Marketing Cloud DEManager Integration
 * Description: Integrates Contact Form 7 with Salesforce Marketing Cloud DEManager
 * Version: 1.0.0
 * Author: WebFX
 * Author URI: https://webfx.com
 */

final class FX_Salesforce_Marketing_Cloud_DEManager {
    const VERBOSE = true;

    private function __construct() {
        add_action( 'wpcf7_mail_sent', [self::class, 'wpcf7_mail_sent'] );
    }

    public static function init() {
        static $instance = null;

        return is_null( $instance ) ? $instance = new self() : $instance;
    }

    public static function wpcf7_mail_sent( $contact_form ) {
        $submission = WPCF7_Submission::get_instance();

        if ( $submission ) {
            $data = $submission->get_posted_data();

            self::verbose( 'Data received from Contact Form 7: ' . print_r( $data, true ) );

            switch ( $contact_form->id() ) {
                case 7: return self::send7( $data );
                case 883: return self::send883( $data );
                case 1123: return self::send1123( $data );
                case 8346: return self::send8346( $data );
                case 3349: return self::send3349( $data );
                case 1122: return self::send1122( $data );
                case 10201: return self::send10201( $data );
                case 882: return self::send882( $data );
                case 17642: return self::send17642( $data );
                case 53: return self::send53( $data );
                // TODO - Add other contact forms
            }
        }
    }

    private static function send7( array $data) {
        self::send([
            'Email' => $data['customer-email'] ?? '',
            'CompanyName' => $data['customer-company-name'] ?? '',
            'Phone' => preg_replace( '/[^0-9]/', '', $data['customer-telephone'] ?? '' ),
            'City' => $data['customer-city'] ?? '',
            'State' => $data['customer-state'][0] ?? '',
            'Name' => $data['customer-name'] ?? '',
            'ZIP' => $data['zip-code'] ?? '',
            'ContactMethod' => $data['customer-contact-method'][0] ?? '',
            'Division' => $data['customer-service'][0] ?? '',
            'HowCanWeHelp' => $data['customer-message'] ?? '',
            'OptIn' => empty( $data['customer-subscribe'] ) ? 'False' : 'True'
        ]);
    }

    private static function send883( array $data) {
        self::send([
            'Name' => $data['customer-name'] ?? '',
            'CompanyName' => $data['customer-company-name'] ?? '',
            'Phone' => preg_replace( '/[^0-9]/', '', $data['customer-telephone'] ?? '' ),
            'ZIP' => $data['zip-code'] ?? '',
            'Email' => $data['customer-email'] ?? '',
            'CustomerNumber' => $data['blanchard-customer-number'] ?? '',
            'TrainingInterest' => $data['customer-training-interest'][0] ?? '',
            'HowCanWeHelp' => $data['customer-message'] ?? '',
            'RefererPage' => $data['referer-page'] ?? '',
            
        ]);
    }

    private static function send1123( array $data) {
        self::send([
            'Name' => $data['fullname'] ?? '',
            'CompanyName' => $data['company'] ?? '',
            'Email' => $data['email'] ?? '',
            'ZIP' => $data['zip-code'] ?? '',
        ]);
    }

    private static function send8346( array $data) {
        self::send([
            'Machine' => $data['machine'] ?? '',
            'Name' => $data['fullname'] ?? '',
            'CompanyName' => $data['company'] ?? '',
            'Email' => $data['email'] ?? '',
            'Phone' => preg_replace( '/[^0-9]/', '', $data['phone_number'] ?? '' ),
            'City' => $data['city'] ?? '',
            'State' => $data['customer-state'][0] ?? '',
            'ZIP' => $data['zip-code'] ?? '',
            'BlanchardAccount' => $data['radio'][0] ?? '',
            'HowCanWeHelp' => $data['comment'] ?? '',
            'RefererPage' => $data['referer-page'] ?? '',
        ]);
    }

    private static function send3349( array $data) {
        self::send([
            'Machine' => $data['machine'] ?? '',
            'SerialNumber' => $data['machine-serial-number'] ?? '',
            'MachineHours' => $data['machine-hours'] ?? '',
            'Name' => $data['fullname'] ?? '',
            'CompanyName' => $data['company'] ?? '',
            'Email' => $data['email'] ?? '',
            'Phone' => preg_replace( '/[^0-9]/', '', $data['phone_number'] ?? '' ),
            'City' => $data['city'] ?? '',
            'State' => $data['customer-state'][0] ?? '',
            'ZIP' => $data['zip-code'] ?? '',
            'BlanchardAccount' => $data['radio'][0] ?? '',
            'HowCanWeHelp' => $data['comment'] ?? '',
            'RefererPage' => $data['referer-page'] ?? ''
        ]);
    }

    private static function send1122( array $data) {
        self::send([
            'Name' => $data['customer-name'] ?? '',
            'CompanyName' => $data['customer-company-name'] ?? '',
            'Phone' => preg_replace( '/[^0-9]/', '', $data['customer-telephone'] ?? '' ),
            'ZIP' => $data['zip-code'] ?? '',
            'Email' => $data['customer-email'] ?? '',
            'ContactMethod' => $data['customer-contact-method'][0] ?? '',
            'Make' => $data['make'] ?? '',
            'Model' => $data['model'] ?? '',
            'SerialNumber' => $data['serial-number'] ?? '',
            'HowCanWeHelp' => $data['customer-message'] ?? '',
            'RefererPage' => $data['referer-page'] ?? '',
            'OptIn' => empty( $data['customer-subscribe'] ) ? 'False' : 'True',
        ]);
    }

    private static function send10201( array $data) {
        self::send([
            'Name' => $data['customer-name'] ?? '',
            'CompanyName' => $data['customer-company-name'] ?? '',
            'Phone' => preg_replace( '/[^0-9]/', '', $data['customer-telephone'] ?? '' ),
            'Email' => $data['customer-email'] ?? '',
            'ZIP' => $data['zip-code'] ?? '',
            'ContactMethod' => $data['customer-contact-method'][0] ?? '',
            'EquipmentYear' => $data['equipment-year'] ?? '',
            'Make' => $data['make'] ?? '',
            'Model' => $data['model'] ?? '',
            'SerialNumber' => $data['serial-number'] ?? '',
            'Hours' => $data['hours'] ?? '',
            'HowCanWeHelp' => $data['customer-message'] ?? '',
            'RefererPage' => $data['referer-page'] ?? '',
        ]);
    }

    private static function send882( array $data) {
        self::send([
            'Name' => $data['customer-name'] ?? '',
            'CompanyName' => $data['customer-company-name'] ?? '',
            'Phone' => preg_replace( '/[^0-9]/', '', $data['customer-telephone'] ?? '' ),
            'Email' => $data['customer-email'] ?? '',
            'ZIP' => $data['zip-code'] ?? '',
            'CustomerNumber' => $data['blanchard-customer-number'] ?? '',
            'TrainingInterest' => $data['customer-training-interest'][0] ?? '',
            'HowCanWeHelp' => $data['customer-message'] ?? '',
            'RefererPage' => $data['referer-page'] ?? '',
        ]);
    }

    private static function send17642( array $data) {
        self::send([
            'Name' => $data['customer-name'] ?? '',
            'CompanyName' => $data['customer-company-name'] ?? '',
            'Phone' => preg_replace( '/[^0-9]/', '', $data['customer-telephone'] ?? '' ),
            'Email' => $data['customer-email'] ?? '',
            'ZIP' => $data['zip-code'] ?? '',
            'CustomerNumber' => $data['blanchard-customer-number'] ?? '',
            'TrainingInterest' => $data['customer-training-interest'][0] ?? '',
            'HowCanWeHelp' => $data['customer-message'] ?? '',
            'RefererPage' => $data['referer-page'] ?? '',
        ]);
    }

    private static function send53( array $data) {
        self::send([
            'Name' => $data['fullname'] ?? '',
            'Phone' => preg_replace( '/[^0-9]/', '', $data['phone'] ?? '' ),
            'Email' => $data['email'] ?? '',
            'ZIP' => $data['zip-code'] ?? '',
            'HowCanWeHelp' => $data['how_may_we_help_you'] ?? '',
            'RefererPage' => $data['referer-page'] ?? '',
        ]);
    }


    private static function send( array $data ) {
        $defaults = [
            '_clientID' => '546005670',
            '_deExternalKey' => 'LeadForm_SignUp',
            '_action' => 'add',
            '_returnXML' => '0',
            '_successURL' => 'https://www.blanchardmachinery.com/Success',
            '_errorURL' => 'https://www.blanchardmachinery.com/Failed',
        ];

        $data = array_merge( $defaults, $data ); // allow for defaults to be overridden

        self::verbose( 'Data being sent to DEManager: ' . print_r( $data, true ) );

        // $url = 'http://cl.exct.net/DEManager.aspx';
        $url = 'https://cl.s13.exct.net/DEManager.aspx';

        $response = wp_remote_post( $url, [
            'method' => 'POST',
            'body' => http_build_query( $data ),
            'headers' => [
                'Content-Type' => 'application/x-www-form-urlencoded',
            ]
        ]);

        if ( is_wp_error( $response ) ) {
            self::log( "Salesforce API request failed: {$response->get_error_message()}" );
        } else {
            $status = wp_remote_retrieve_response_code( $response );

            if ( $status !== 200 ) {
                self::log( "Salesforce API request failed ($status): " . wp_remote_retrieve_body( $response ) );
            } else {
                self::verbose( "Salesforce API request success ($status): " . wp_remote_retrieve_body( $response ) );
            }
        }
    }

    private static function log( string $s ) {
        error_log( "[FX Salesforce Marketing Cloud DEManager]: $s" );
    }

    private static function verbose( string $s ) {
        if ( self::VERBOSE ) {
            self::log( $s );
        }
    }
}
FX_Salesforce_Marketing_Cloud_DEManager::init();


