<?php if ( ! defined( 'ABSPATH' ) ) {exit;} // Exit if accessed directly.

use Elementor\Widget_Base;
use Elementor\Icons_Manager;
use Elementor\Controls_Manager;

class Xtra_Elementor_Widget_subscribe extends Widget_Base { 

	protected $id = 'cz_subscribe';

	public function __construct( $data = [], $args = null ) {

		// Run parent.
		parent::__construct( $data, $args );

		// Handle form AJAX request.
		add_action( 'wp_ajax_cz_subscribe_ajax', [ 'Codevz_Plus', 'subscribe_ajax' ] );
		add_action( 'wp_ajax_nopriv_cz_subscribe_ajax', [ 'Codevz_Plus', 'subscribe_ajax' ] );

		// Handle secret URL confirmation.
		add_action( 'init', [ 'Codevz_Plus', 'subscribe_confirm' ] );

	}

	public function get_name() {
		return $this->id;
	}

	public function get_title() {
		return esc_html__( 'Subscribe', 'codevz-plus' );
	}

	public function get_icon() {
		return 'xtra-subscribe';
	}

	public function get_categories() {
		return [ 'xtra' ];
	}

	public function get_keywords() {

		return [
			esc_html__( 'XTRA', 'codevz-plus' ),
			esc_html__( 'Codevz Plus', 'codevz-plus' ),
			esc_html__( 'Subscribe', 'codevz-plus' ),
			esc_html__( 'Newsletter', 'codevz-plus' ),
			'XTRA',
			'Codevz Plus',
			'Subscribe',
			'Newsletter',
			'Mailchimp',
			'Feed',
			'Email',
			'Sign Up',
			'Subscription',
			'Updates',
		];

	}
	
	public function get_style_depends() {
		return [ $this->id, 'cz_parallax' ];
	}

	public function get_script_depends() {
		return [ $this->id, 'subscribe', 'cz_parallax' ];
	}
	
	public function register_controls() {

		$free = Codevz_Plus::is_free();

		$this->start_controls_section(
			'section_content',
			[
				'label' => esc_html__( 'Settings', 'codevz-plus' ),
				'tab' => Controls_Manager::TAB_CONTENT,
			]
		);

		$this->add_control(
			'style',
			[
				'label' => esc_html__( 'Style', 'codevz-plus' ),
				'type' => Controls_Manager::SELECT,
				'default' => '',
				'options' => [
					'cz_subscribe_style_default' 									=> esc_html__( '~ Default ~', 'codevz-plus' ),
					'cz_subscribe_square cz_subscribe_style_1' 						=> esc_html__( 'Style', 'codevz-plus' ) . ' 1',
					'cz_subscribe_round cz_subscribe_style_2' 						=> esc_html__( 'Style', 'codevz-plus' ) . ' 2',
					'cz_subscribe_round_2 cz_subscribe_style_3' 					=> esc_html__( 'Style', 'codevz-plus' ) . ' 3',
					'cz_subscribe_relative cz_subscribe_square cz_subscribe_style_4' => esc_html__( 'Style', 'codevz-plus' ) . ' 4',
					'cz_subscribe_relative cz_subscribe_round cz_subscribe_style_5' => esc_html__( 'Style', 'codevz-plus' ) . ' 5',
					'cz_subscribe_col cz_subscribe_square cz_subscribe_style_6' 	=> esc_html__( 'Style', 'codevz-plus' ) . ' 6',
					'cz_subscribe_col cz_subscribe_style_7' 						=> esc_html__( 'Style', 'codevz-plus' ) . ' 7',
				],
			]
		);

		$this->add_control(
			'name',
			[
				'label' 	=> esc_html__( 'Name placeholder', 'codevz-plus' ),
				'type' 		=> Controls_Manager::TEXT
			]
		);
		$this->add_control(
			'placeholder',
			[
				'label' 	=> esc_html__( 'Email placeholder', 'codevz-plus' ),
				'type' 		=> Controls_Manager::TEXT,
				'default' 	=> esc_html__( 'Your email ...', 'codevz-plus' )
			]
		);

		$this->add_control(
			'position',
			[
				'label' => esc_html__( 'Position', 'codevz-plus' ),
				'help' => esc_html__( 'According to form width', 'codevz-plus' ),
				'type' => Controls_Manager::SELECT,
				'options' => [
					'' 			=> esc_html__( 'Left', 'codevz-plus' ),
					'center'	=> esc_html__( 'Center', 'codevz-plus' ),
					'right' 	=> esc_html__( 'Right', 'codevz-plus' ),
				],
			]
		);

		$this->add_control(
			'btn_position',
			[
				'label' => esc_html__( 'Button Position', 'codevz-plus' ),
				'type' => Controls_Manager::SELECT,
				'options' => [
					'' 							=> esc_html__( 'Left', 'codevz-plus' ),
					'cz_subscribe_btn_center' 	=> esc_html__( 'Center', 'codevz-plus' ),
					'cz_subscribe_btn_right' 	=> esc_html__( 'Right', 'codevz-plus' ),
				]
			]
		);

		$this->add_control(
			'btn_title',
			[
				'label' => esc_html__('Button Title', 'codevz-plus' ),
				'type' => Controls_Manager::TEXT,
				'default' => esc_html__('join now', 'codevz-plus' )
			]
		);

		$this->add_control(
			'icon',
			[
				'label' => esc_html__( 'Button Icon', 'codevz-plus' ),
				'type' => Controls_Manager::ICONS,
				'skin' => 'inline',
				'label_block' => false
			]
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'section_method',
			[
				'label' => esc_html__( 'Type', 'codevz-plus' ),
				'tab' => Controls_Manager::TAB_CONTENT,
			]
		);

		$this->add_control(
			'ajax',
			[
				'label' 	=> esc_html__( 'Type', 'codevz-plus' ),
				'type' 		=> Controls_Manager::SELECT,
				'options' 	=> [
					'' 			=> esc_html__( 'Custom form', 'codevz-plus' ),
					'2' 		=> esc_html__( 'Built-in AJAX', 'codevz-plus' )
				],
			]
		);

		$description = '<div class="cz-subscribe-desc">
			<span>' . esc_html__( 'All submitted emails will be stored as WordPress users with the', 'codevz-plus' ) . ' <strong>' . esc_html__( 'Subscriber', 'codevz-plus' ) . '</strong> ' . esc_html__( 'role. Users must confirm their subscription through a link sent to their email (double opt-in). Only confirmed emails will be added.', 'codevz-plus' ) . '</span>

			<span>' . esc_html__( 'You can manage these subscribers directly from the', 'codevz-plus' ) . ' <strong>' . esc_html__( 'Users > All Users', 'codevz-plus' ) . '</strong> ' . esc_html__( 'page in your WordPress dashboard. Use the role filter to view only subscribers.', 'codevz-plus' ) . '</span>

			<span>' . esc_html__( 'To send newsletters, you can use plugins like:', 'codevz-plus' ) . '</span>
			<ul>
				<li><strong>MailPoet</strong> – ' . esc_html__( 'send emails directly from your WordPress site.', 'codevz-plus' ) . '</li>
				<li><strong>Newsletter Plugin</strong> – ' . esc_html__( 'manage lists, campaigns, and automations.', 'codevz-plus' ) . '</li>
				<li><strong>Mailchimp for WP</strong> – ' . esc_html__( 'connect with your Mailchimp audience.', 'codevz-plus' ) . '</li>
			</ul>

			<span>' . esc_html__( 'Subscribers are created as real WordPress accounts. Do not assign sensitive capabilities to the "subscriber" role unless needed.', 'codevz-plus' ) . '</span>
		</div>';

		$this->add_control(
			'ajax_notice',
			[
				'type' 			=> Controls_Manager::NOTICE,
				'notice_type' 	=> 'warning',
				'dismissible' 	=> false,
				'heading' 		=> esc_html__( 'Built-in AJAX', 'codevz-plus' ),
				'content' 		=> $description,
				'condition' 	=> [
					'ajax' 			=> '2'
				]
			]
		);

		$this->add_control(
			'action',
			[
				'label' => esc_html__( 'Action URL', 'codevz-plus' ),
				'type' => Controls_Manager::TEXT,
				'condition' => [
					'ajax' => ''
				]
			]
		);

		$this->add_control(
			'type_attr',
			[
				'label' => esc_html__( 'Type attribute', 'codevz-plus' ),
				'type' => Controls_Manager::SELECT,
				'default' => 'email',
				'options' => [
					'email'		=> 'email',
					'text'		=> 'text',
					'number'	=> 'number',
					'search'	=> 'search',
					'tel'		=> 'tel',
					'time'		=> 'time',
					'date'		=> 'date',
					'url'		=> 'url',
					'password'	=> 'password',
				],
				'condition' => [
					'ajax' => ''
				]
			]
		);

		$this->add_control(
			'name_attr',
			[
				'label' => esc_html__('Email attribute', 'codevz-plus' ),
				'type' => Controls_Manager::TEXT,
				'default' => 'email',
				'condition' => [
					'ajax' => ''
				]
			]
		);

		$this->add_control(
			'method',
			[
				'label' => esc_html__( 'Method', 'codevz-plus' ),
				'type' => Controls_Manager::SELECT,
				'default' => 'post',
				'options' => [
					'post' => esc_html__( 'Post', 'codevz-plus' ),
					'get' => esc_html__( 'Get', 'codevz-plus' ),
				],
				'condition' => [
					'ajax' => ''
				]
			]
		);

		$this->add_control(
			'target',
			[
				'label' => esc_html__( 'Target', 'codevz-plus' ),
				'type' => Controls_Manager::SELECT,
				'default' => '_blank',
				'options' => [
					'_blank' => '_blank',
					'_self' => '_self',
				],
				'condition' => [
					'ajax' => ''
				]
			]
		);

		$this->end_controls_section();

		// Parallax settings.
		Xtra_Elementor::parallax_settings( $this );

		$this->start_controls_section(
			'section_style',
			[
				'label' => esc_html__( 'Style', 'codevz-plus' ),
				'tab' => Controls_Manager::TAB_STYLE,
			]
		);

		$this->add_responsive_control(
			'sk_overall',
			[
				'label' 	=> esc_html__( 'Container', 'codevz-plus' ),
				'type' 		=> 'stylekit',
				'settings' 	=> [ 'width', 'background', 'border' ],
				'selectors' => Xtra_Elementor::sk_selectors( '.cz_subscribe_elm' ),
			]
		);

		$this->add_responsive_control(
			'sk_input',
			[
				'label' 	=> esc_html__( 'Input', 'codevz-plus' ),
				'type' 		=> 'stylekit',
				'settings' 	=> [ 'color', 'text-align', 'font-size', 'background', 'border' ],
				'selectors' => Xtra_Elementor::sk_selectors( '.cz_subscribe_elm input' ),
			]
		);

		$this->add_responsive_control(
			'sk_button',
			[
				'label' 	=> esc_html__( 'Button', 'codevz-plus' ),
				'type' 		=> 'stylekit',
				'settings' 	=> [ 'color', 'background' ],
				'selectors' => Xtra_Elementor::sk_selectors( '.cz_subscribe_elm button', '.cz_subscribe_elm button:hover' ),
			]
		);

		$this->add_responsive_control(
			'sk_icon',
			[
				'label' 	=> esc_html__( 'Icon', 'codevz-plus' ),
				'type' 		=> 'stylekit',
				'settings' 	=> [ 'color', 'background' ],
				'condition' => [
					'icon[value]!' => ''
				],
				'selectors' => Xtra_Elementor::sk_selectors( '.cz_subscribe_elm button i', '.cz_subscribe_elm button:hover i' ),
			]
		);

		$this->add_responsive_control(
			'sk_msg',
			[
				'label' 	=> esc_html__( 'Message', 'codevz-plus' ),
				'type' 		=> 'stylekit',
				'settings' 	=> [ 'color', 'background' ],
				'condition' => [
					'ajax' 		=> '2'
				],
				'selectors' => Xtra_Elementor::sk_selectors( '.cz_subscribe_msg' ),
			]
		);

	}

	public function render() {

		$settings = $this->get_settings_for_display();

		ob_start();
		Icons_Manager::render_icon( $settings['icon'], [ 'class' => $settings['btn_title'] ? 'mr8' : '' ] );
		$icon = ob_get_clean();

		$btn_title = $icon ? $icon . $settings['btn_title'] : $settings['btn_title'];

		$classes = [];
		$classes[] = 'cz_subscribe_elm clr';
		$classes[] = $settings['style'];
		$classes[] = $settings['btn_position'];
		$classes[] = $settings['position'] ? 'cz_subscribe_elm_' . $settings['position'] : '';
		$classes[] = empty( $settings['name'] ) ? '' : 'cz_subscribe_has_name';
		$classes[] = empty( $settings['ajax'] ) ? '' : 'cz_subscribe_ajax';

		if ( ! $settings['action'] ) {
			$settings['action'] = get_site_url();
		}

		$name_input = '';
		$form_name = 'mc-embedded-subscribe-form';

		// Check AJAX method.
		if ( ! empty( $settings['ajax'] ) && $settings['ajax'] === '2' ) {

			$settings['action'] 	= '#';
			$settings['type_attr'] 	= 'email';
			$settings['name_attr'] 	= 'email';
			$settings['method'] 	= 'get';
			$settings['target'] 	= '_self';

			$form_name = 'codevz-plus-subscribe-ajax';

		}

		$name_input  = empty( $settings['name'] ) ? '' : '<input type="text" name="name" placeholder="' . esc_attr( $settings['name'] ) . '" required="required">';
		$email_input = '<input type="' . esc_attr( $settings['type_attr'] ) . '" name="' . esc_attr( $settings['name_attr'] ) . '" placeholder="' . esc_attr( $settings['placeholder'] ) . '" required="required">';

		ob_start();
		Xtra_Elementor::parallax( $settings );
		?>

		<form<?php echo wp_kses_post( (string) Codevz_Plus::classes( [], $classes ) ); ?> data-nonce="<?php echo esc_attr( wp_create_nonce( 'cz_subscribe_nonce' ) ); ?>" action="<?php echo esc_url( $settings['action'] ); ?>" method="<?php echo esc_attr( $settings['method'] ); ?>" name="<?php echo esc_attr( $form_name ); ?>" target="<?php echo esc_url( $settings['target'] ); ?>">
			<div>
				<?php echo do_shortcode( $name_input ); ?>
				<?php echo do_shortcode( $email_input ); ?>
				<input type="text" name="website" placeholder="Your website">
			</div>
			<button name="subscribe" type="submit"><?php echo do_shortcode( wp_kses_post( $btn_title ) ); ?></button>
			<span class="clr"></span>
			<p class="cz_subscribe_msg"></p>
		</form>

		<?php

		Xtra_Elementor::parallax( $settings, true );
		$content = ob_get_clean();

		Codevz_Plus::tpl( 'page_builder', $content );

	}

}
