<?php

use QuadLayers\QLWAPP\Models\Box as Models_Box;
use QuadLayers\QLWAPP\Models\Button as Models_Button;
use QuadLayers\QLWAPP\Models\Display as Models_Display;
use QuadLayers\QLWAPP\Models\Scheme as Models_Scheme;
use QuadLayers\QLWAPP\Models\Contacts as Models_Contacts;

if ( ! defined( 'ABSPATH' ) ) {
	return;
}

require_once 'class-base.php';
require_once 'class-contact.php';
require_once 'class-display-services.php';
require_once 'class-frontend.php';
require_once 'class-woocommerce.php';
require_once 'migration-button-to-contact.php';

if ( class_exists( 'QLWAPP_PRO' ) ) {
	$old = QLWAPP_PRO::instance();
	remove_action( 'qlwapp_init', array( $old, 'includes' ) );
}

// based on original work from the PHP Laravel framework
if ( ! function_exists( 'str_contains' ) ) {
	function str_contains( $haystack, $needle ) {
		return $needle !== '' && mb_strpos( $haystack, $needle ) !== false;
	}
}

// filter old phone number in wp_options
/**
 * Compatibility with the old version
 */
add_filter(
	'option_qlwapp',
	function ( $qlwapp ) {

		// Replace the old default phone number with the current default. Only
		// touches contacts now; the same field on Button was removed when the
		// contact-data cluster was consolidated into Contact.
		if ( isset( $qlwapp['contacts'] ) ) {
			foreach ( $qlwapp['contacts'] as $id => $contact ) {
				if ( isset( $contact['phone'] ) && '12019713894' == $contact['phone'] ) {
					$qlwapp['contacts'][ $id ]['phone'] = QLWAPP_PHONE_NUMBER;
				}
			}
		}

		return $qlwapp;
	}
);

class QLWAPP_Compatibility {

	protected static $instance;

	// fix required header in license tab
	public function settings_header() {
		global $submenu;
		include QLWAPP_PLUGIN_DIR . '/lib/view/backend/pages/parts/header.php';
	}

	// fix settings override with defaults on license save
	public function settings_sanitize( $qlwapp ) {
		$current = get_option( QLWAPP_DOMAIN, array() );

		return wp_parse_args( $qlwapp, $current );
	}

	// required to save license
	public function settings_register() {
		register_setting( sanitize_key( QLWAPP_DOMAIN . '-group' ), sanitize_key( QLWAPP_DOMAIN ), array( $this, 'settings_sanitize' ) );
	}

	public function previous_author( $qlwapp ) {
		// button (legacy upgrade path from the very first plugin author). The
		// contact-data fields (phone, message) now live on the first contact;
		// seed contacts[0] when the legacy options exist so the upgrade is
		// lossless. Button only keeps presentation-level fields.
		if ( $phone = get_option( 'whatsapp_chat_page' ) ) {
			$qlwapp['contacts'][0]['phone'] = $phone;
		}
		if ( $text = get_option( 'whatsapp_chat_button' ) ) {
			$qlwapp['button']['text'] = $text;
		}
		if ( get_option( 'whatsapp_chat_powered_by' ) ) {
			$qlwapp['button']['developer'] = 'yes';
		}
		if ( false !== get_option( 'whatsapp_chat_round' ) ) {
			$qlwapp['button']['rounded'] = 'no';
		}
		if ( false !== get_option( 'whatsapp_chat_down' ) ) {
			$vposition                    = get_option( 'whatsapp_chat_down' ) ? 'bottom' : 'middle';
			$hposition                    = get_option( 'whatsapp_chat_left_side' ) ? 'left' : 'right';
			$qlwapp['button']['position'] = "{$vposition}-{$hposition}";
		}
		if ( $message = get_option( 'whatsapp_chat_msg' ) ) {
			$qlwapp['contacts'][0]['message'] = $message;
		}
		// display
		if ( $mobile = get_option( 'whatsapp_chat_mobile' ) ) {
			$qlwapp['display']['devices'] = 'mobile';
		}
		if ( get_option( 'whatsapp_chat_hide_button' ) ) {
			$qlwapp['display']['devices'] = 'hide';
		}
		if ( get_option( 'whatsapp_chat_hide_post' ) ) {
			$qlwapp['display']['post'] = array( 'none' );
		}
		if ( get_option( 'whatsapp_chat_hide_page' ) ) {
			$qlwapp['display']['page'] = array( 'none' );
		}
		// scheme
		if ( get_option( 'whatsapp_chat_dark' ) ) {
			$qlwapp['scheme']['brand'] = '#075E54';
			$qlwapp['scheme']['text']  = '#ffffff';
		} elseif ( get_option( 'whatsapp_chat_white' ) ) {
			$qlwapp['scheme']['brand'] = '#ffffff';
			$qlwapp['scheme']['text']  = '#075E54';
		} elseif ( false !== get_option( 'whatsapp_chat_white' ) ) {
			$qlwapp['scheme']['brand'] = '#20B038';
			$qlwapp['scheme']['text']  = '#ffffff';
		}

		return $qlwapp;
	}

	public function previous_versions( $qlwapp ) {
		if ( isset( $qlwapp['chat']['response'] ) && ! isset( $qlwapp['box']['response'] ) ) {
			$qlwapp['box']['response'] = $qlwapp['chat']['response'];
		}
		if ( isset( $qlwapp['box']['enable'] ) && ! isset( $qlwapp['button']['box'] ) ) {
			$qlwapp['button']['box'] = $qlwapp['box']['enable'];
		}
		if ( isset( $qlwapp['user']['message'] ) && ! isset( $qlwapp['contacts'][0]['message'] ) ) {
			$qlwapp['contacts'][0]['message'] = $qlwapp['user']['message'];
		}
		if ( isset( $qlwapp['button']['rounded'] ) && $qlwapp['button']['rounded'] == 1 ) {
			$qlwapp['button']['rounded'] = 'yes';
		}
		if ( isset( $qlwapp['button']['layout'] ) && ! in_array( $qlwapp['button']['layout'], array( 'button', 'bubble' ), true ) ) {
			$qlwapp['button']['layout'] = 'button';
		}
		if ( isset( $qlwapp['button']['developer'] ) && $qlwapp['button']['developer'] == 1 ) {
			$qlwapp['button']['developer'] = 'yes';
		}
		// display
		// part free
		if ( isset( $qlwapp['display']['target'] ) ) {

			if ( ! isset( $qlwapp['display']['target']['ids'] ) && isset( $qlwapp['display']['target'][0] ) ) {

				if ( $qlwapp['display']['target'][0] == 'none' ) {
					$qlwapp['display']['target']['ids']     = array(
						'all' => esc_html__( 'All', 'wp-whatsapp-chat' ),
					);
					$qlwapp['display']['target']['include'] = '0';
				} else {
					$qlwapp['display']['target']['ids']     = $qlwapp['display']['target'];
					$qlwapp['display']['target']['include'] = '1';
				}
			}
		}
		// part pro taxonomies
		// rename-re asign
		if ( isset( $qlwapp['display']['category'] ) ) {
			if ( ! isset( $qlwapp['display']['category']['ids'] ) && isset( $qlwapp['display']['category'][0] ) ) {
				$qlwapp['display']['taxonomies']['category']['include'] = '1';
				if ( in_array( 'none', $qlwapp['display']['category'] ) ) {
					$key                                   = array_search( 'none', $qlwapp['display']['category'] );
					$qlwapp['display']['category'][ $key ] = 'all';
					$qlwapp['display']['taxonomies']['category']['include'] = '0';
				}
				$qlwapp['display']['taxonomies']['category']['ids'] = $qlwapp['display']['category'];
			}
		}
		// part PRO
		// rename-re asign o ['entries']
		// PAGE
		if ( isset( $qlwapp['display']['page'] ) ) {
			if ( ! isset( $qlwapp['display']['page']['ids'] ) && isset( $qlwapp['display']['page'][0] ) ) {
				$qlwapp['display']['entries']['page']['include'] = '0';
				if ( in_array( 'none', $qlwapp['display']['page'] ) ) {
					$key                               = array_search( 'none', $qlwapp['display']['page'] );
					$qlwapp['display']['page'][ $key ] = 'all';
					$qlwapp['display']['entries']['page']['include'] = '0';
				}
				$qlwapp['display']['entries']['page']['ids'] = $qlwapp['display']['page'];
			}
		}
		// POST
		if ( isset( $qlwapp['display']['post'] ) ) {
			if ( ! isset( $qlwapp['display']['post']['ids'] ) && isset( $qlwapp['display']['post'][0] ) ) {
				$qlwapp['display']['entries']['post']['include'] = '1';

				if ( in_array( 'none', $qlwapp['display']['post'] ) ) {
					$key                               = array_search( 'none', $qlwapp['display']['post'] );
					$qlwapp['display']['post'][ $key ] = 'all';
					$qlwapp['display']['entries']['post']['include'] = '0';
				}
				$qlwapp['display']['entries']['post']['ids'] = $qlwapp['display']['post'];
			}
		}

		return $qlwapp;
	}

	public function premium_version() {
		global $qlwapp;

		$qlwapp = array();

		// models
		$models_button   = Models_Button::instance();
		$models_box      = Models_Box::instance();
		$models_contacts = Models_Contacts::instance();
		$models_display  = Models_Display::instance();
		$models_scheme   = Models_Scheme::instance();

		// objects
		$qlwapp['button']   = $models_button->get();
		$qlwapp['box']      = $models_box->get();
		$qlwapp['contacts'] = $models_contacts->get_all();
		$qlwapp['display']  = $models_display->get();
		$qlwapp['scheme']   = $models_scheme->get();

		if ( isset( $qlwapp['contacts'] ) ) {
			if ( count( $qlwapp['contacts'] ) ) {
				foreach ( $qlwapp['contacts'] as $id => $c ) {
					$qlwapp['contacts'][ $id ] = wp_parse_args( $c, $models_contacts->get_args() );

					if ( ! is_admin() ) {
						if ( ! empty( $qlwapp['contacts'][ $id ]['phone'] ) ) {
							$qlwapp['contacts'][ $id ]['phone'] = qlwapp_format_phone( $qlwapp['contacts'][ $id ]['phone'] );
						}
						if ( ! empty( $qlwapp['contacts'][ $id ]['timezone'] ) ) {
							$qlwapp['contacts'][ $id ]['timezone'] = qlwapp_get_timezone_offset( $qlwapp['contacts'][ $id ]['timezone'] );
						}
					}
				}
			}
		}
	}

	// Compatibility Since Version 7.2.0
	public function previous_versions_qlwapp( $model_slug ) {
		$qlwapp = get_option( 'qlwapp', array() );
		if ( ! empty( $qlwapp[ $model_slug ] ) ) {
			$model = array();

			foreach ( $qlwapp[ $model_slug ] as $key => $value ) {
				$model[ str_replace( '-', '_', $key ) ] = $value;
				$model[ $key ]                          = $value;
			}

			return $model;
		}
		return null;
	}

	public function __construct() {
		add_filter( 'wp', array( $this, 'premium_version' ) );
		add_action( 'customize_register', array( $this, 'premium_version' ), -10 );
		add_action( 'admin_init', array( $this, 'settings_register' ) );
		add_filter( 'option_qlwapp', array( $this, 'previous_versions' ) );
		add_filter( 'default_option_qlwapp', array( $this, 'previous_author' ), 20 );
		// Compatibility Since Version 7.2.0
		add_filter(
			'default_option_qlwapp_box',
			function () {
				return $this->previous_versions_qlwapp( 'box' );
			}
		);
		add_filter(
			'default_option_qlwapp_button',
			function () {
				return $this->previous_versions_qlwapp( 'button' );
			}
		);
		add_filter(
			'default_option_qlwapp_display',
			function () {
				return $this->previous_versions_qlwapp( 'display' );
			}
		);
		add_filter(
			'default_option_qlwapp_scheme',
			function () {
				return $this->previous_versions_qlwapp( 'scheme' );
			}
		);
		add_filter(
			'default_option_qlwapp_settings',
			function () {
				return $this->previous_versions_qlwapp( 'settings' );
			}
		);
		add_filter(
			'default_option_qlwapp_woocommerce',
			function () {
				return $this->previous_versions_qlwapp( 'woocommerce' );
			}
		);
		add_filter(
			'default_option_qlwapp_contacts',
			function () {
				return $this->previous_versions_qlwapp( 'contacts' );
			}
		);
	}

	public static function instance() {
		if ( ! isset( self::$instance ) ) {
			self::$instance = new self();
		}
		return self::$instance;
	}
}

QLWAPP_Compatibility::instance();
