<?php

namespace Elementor;

use ElementsKit_Lite\Libs\Framework\Attr;
use Elementor\ElementsKit_Widget_Google_Map_Handler as Handler;

defined('ABSPATH') || exit;

class ElementsKit_Widget_Google_Map extends Widget_Base {

	public $base;

    public function __construct($data = [], $args = null) {
		parent::__construct($data, $args);
	}

	public function get_script_depends() {
		return ['ekit-google-map-api', 'ekit-google-gmaps'];
	}

	public function get_name() {
		return Handler::get_name();
	}

	public function get_title() {
		return Handler::get_title();
	}

	public function get_icon() {
		return Handler::get_icon();
	}

	public function get_categories() {
		return Handler::get_categories();
	}

    public function get_help_url() {
        return '';
    }

	protected function register_controls() {

		$this->start_controls_section( 'map_settings', [
			'label' => esc_html__( 'Settings', 'elementskit' )
		]);

		$this->add_control( 'map_type', [
			'label'       	=> esc_html__( 'Map Type', 'elementskit' ),
			'type' 			=> Controls_Manager::SELECT,
			'default' 		=> 'basic',
			'options' 		=> [
				'basic'  	=> esc_html__( 'Basic', 'elementskit' ),
				'marker'  	=> esc_html__( 'Multiple Marker', 'elementskit' ),
				'static'  	=> esc_html__( 'Static', 'elementskit' ),
				'polyline'  => esc_html__( 'Polyline', 'elementskit' ),
				'polygon'  	=> esc_html__( 'Polygon', 'elementskit' ),
				'overlay'  	=> esc_html__( 'Overlay', 'elementskit' ),
				'routes'  	=> esc_html__( 'With Routes', 'elementskit' ),
				'panorama'  => esc_html__( 'Panorama', 'elementskit' ),
			]
		]);

		$this->add_control( 'map_address_type',
			[
				'label' => __( 'Address Type', 'elementskit' ),
				'type' => Controls_Manager::CHOOSE,
                'default' => 'coordinates',
				'options' => [
					'address' => [
						'title' => __( 'Address', 'elementskit' ),
						'icon' => 'fa fa-map',
					],
					'coordinates' => [
						'title' => __( 'Coordinates', 'elementskit' ),
						'icon' => 'fa fa-map-marker',
					],
				],
			]
		);

	   	$this->add_control( 'map_addr',
			[
				'label' => esc_html__( 'Address', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => true,
				'default' => esc_html__( 'Dhaka, Bangladesh', 'elementskit' ),
				'condition' => [
					'map_address_type' => ['address']
				]
			]
		);

		$this->add_control( 'map_lat',
			[
				'label' => esc_html__( 'Latitude', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => false,
				'default' => esc_html__( '23.749981', 'elementskit' ),
				'condition' => [
					'map_address_type' => ['coordinates']
				]
			]
		);

		$this->add_control( 'map_lng',
			[
				'label' => esc_html__( 'Longitude', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => false,
				'default' => esc_html__( '90.365641', 'elementskit' ),
				'condition' => [
					'map_address_type' => ['coordinates']
				]
			]
		);

		// Start map type static
		// $this->add_control( 'map_static_lat',
		// 	[
		// 		'label' => esc_html__( 'Latitude', 'elementskit' ),
		// 		'type' => Controls_Manager::TEXT,
		// 		'label_block' => false,
		// 		'default' => esc_html__( '23.7808875', 'elementskit' ),
		// 		'condition' => [
		// 			'map_type' => ['static'],
		// 		]
		// 	]
		// );

		// $this->add_control( 'map_static_lng',
		// 	[
		// 		'label' => esc_html__( 'Longitude', 'elementskit' ),
		// 		'type' => Controls_Manager::TEXT,
		// 		'label_block' => false,
		// 		'default' => esc_html__( '90.2792373', 'elementskit' ),
		// 		'condition' => [
		// 			'map_type' => ['static'],
		// 		]
		// 	]
		// );

		$this->add_control( 'map_resolution_title',
			[
				'label' => esc_html__( 'Map Image Resolution', 'elementskit' ),
				'type' => Controls_Manager::HEADING,
				'separator' => 'before',
				'condition' => [
					'map_type' => 'static'
				]
			]
		);

		$this->add_control(
			'map_static_dimension_note',
			[
				'type'	=> Controls_Manager::RAW_HTML,
				'raw'	=> esc_html__('Static Maps images can be returned in any size up to 640 x 640 pixels. Google Maps Platform Premium Plan customers, who are correctly authenticating requests to the Maps Static API, can request images up to 2048 x 2048 pixels.', 'elementskit'),
				'content_classes'	=> 'elementor-panel-alert elementor-panel-alert-info',
				'condition' => [
					'map_type' => 'static'
				]
			]
		);

		$this->add_control( 'map_static_width',
			[
				'label' => esc_html__( 'Static Image Width', 'elementskit' ),
				'type' => Controls_Manager::SLIDER,
				'default' => [
					'size' => 610
				],
				'range' => [
					'px' => [
						'max' => 1400,
					],
				],
				'condition' => [
					'map_type' => 'static'
				]
			]
		);

		$this->add_control( 'map_static_height',
			[
				'label' => esc_html__( 'Static Image Height', 'elementskit' ),
				'type' => Controls_Manager::SLIDER,
				'default' => [ 'size' => 300 ],
				'range' => [ 'px' => [ 'max' => 700 ] ],
				'condition' => [
					'map_type' => 'static'
				]
			]
		);
		// End map type static

		// Start map type panoroma
		$this->add_control( 'map_panorama_lat',
			[
				'label' => esc_html__( 'Latitude', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => false,
				'default' => esc_html__( '23.7808875', 'elementskit' ),
				'condition' => [
					'map_type' => ['panorama'],
				]
			]
		);

		$this->add_control( 'map_panorama_lng',
			[
				'label' => esc_html__( 'Longitude', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => false,
				'default' => esc_html__( '90.2792373', 'elementskit' ),
				'condition' => [
					'map_type' => ['panorama'],
				]
			]
		);
		// End map type panoroma

		$this->add_control( 'map_overlay_content',
			[
				'label' => __( 'Content', 'elementskit' ),
				'type' => \Elementor\Controls_Manager::WYSIWYG,
				'default' => __( 'Your content will goes here', 'elementskit' ),
				'condition' => [
					'map_type' => 'overlay'
				]
			]
		);

		$this->end_controls_section();

		
		$this->start_controls_section(
			'ekit_section_google_map_basic_marker_settings',
			[
				'label' => esc_html__( 'Marker Settings', 'elementskit' ),
				'condition' => [
					'map_type' => ['basic']
				]
			]
		);
		$this->add_control(
			'map_basic_marker_title',
			[
				'label' => esc_html__( 'Title', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => true,
				'default' => esc_html__( 'Google Map Title', 'elementskit' )
			]
		);
		$this->add_control(
			'map_basic_marker_content',
			[
				'label' => esc_html__( 'Content', 'elementskit' ),
				'type' => Controls_Manager::TEXTAREA,
				'label_block' => true,
				'default' => esc_html__( 'Google map content', 'elementskit' )
			]
		);
		$this->add_control(
			'map_basic_marker_icon_enable',
			[
				'label' => __( 'Custom Marker Icon', 'elementskit' ),
				'type' => Controls_Manager::SWITCHER,
				'default' => 'no',
				'label_on' => __( 'Yes', 'elementskit' ),
				'label_off' => __( 'No', 'elementskit' ),
				'return_value' => 'yes',
			]
		);
			$this->add_control(
			'map_basic_marker_icon',
			[
				'label' => esc_html__( 'Marker Icon', 'elementskit' ),
				'type' => Controls_Manager::MEDIA,
				'default' => [
					// 'url' => Utils::get_placeholder_image_src(),
				],
				'condition' => [
					'map_basic_marker_icon_enable' => 'yes'
				]
			]
		);
		$this->add_control(
			'map_basic_marker_icon_width',
			[
				'label' => esc_html__( 'Marker Width', 'elementskit' ),
				'type' => Controls_Manager::SLIDER,
				'default' => [
					'size' => 32
				],
				'range' => [
					'px' => [
						'max' => 150,
					],
				],
				'condition' => [
					'map_basic_marker_icon_enable' => 'yes'
				]
			]
		);
		$this->add_control(
			'map_basic_marker_icon_height',
			[
				'label' => esc_html__( 'Marker Height', 'elementskit' ),
				'type' => Controls_Manager::SLIDER,
				'default' => [
					'size' => 32
				],
				'range' => [
					'px' => [
						'max' => 150,
					],
				],
				'condition' => [
					'map_basic_marker_icon_enable' => 'yes'
				]
			]
		);
		$this->end_controls_section();
			

		$this->start_controls_section(
				'ekit_section_google_map_marker_settings',
				[
					'label' => esc_html__( 'Marker Settings', 'elementskit' ),
					'condition' => [
						'map_type' => ['marker', 'polyline', 'routes', 'static']
					]
				]
		);

		$map_marker_repeater = new Repeater();

		$map_marker_repeater->add_control(
			'map_marker_lat',
			[
				'label' => esc_html__( 'Latitude', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => true,
				'default' => esc_html__( '28.948790', 'elementskit' ),
			]
		);

		$map_marker_repeater->add_control(
			'map_marker_lng',
			[
				'label' => esc_html__( 'Longitude', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => true,
				'default' => esc_html__( '-81.298843', 'elementskit' ),
			]
		);

		$map_marker_repeater->add_control(
			'map_marker_title',
			[
				'label' => esc_html__( 'Tooltrip', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => true,
				'default' => esc_html__( 'Marker Title', 'elementskit' ),
			]
		);

		$map_marker_repeater->add_control(
			'map_marker_content',
			[
				'label' => esc_html__( 'Content', 'elementskit' ),
				'type' => Controls_Manager::TEXTAREA,
				'label_block' => true,
				'default' => esc_html__( 'Marker Content. You can put html here.', 'elementskit' ),
			]
		);

		$map_marker_repeater->add_control(
			'map_marker_icon_enable',
			[
				'label' => __( 'Use Custom Icon', 'elementskit' ),
				'type' => Controls_Manager::SWITCHER,
				'default' => 'no',
				'label_on' => __( 'Yes', 'elementskit' ),
				'label_off' => __( 'No', 'elementskit' ),
				'return_value' => 'yes',
			]
		);

		$map_marker_repeater->add_control(
			'map_marker_icon',
			[
				'label' => esc_html__( 'Custom Icon', 'elementskit' ),
				'type' => Controls_Manager::MEDIA,
				'default' => [],
				'condition' => [
					'map_marker_icon_enable' => 'yes'
				]
			]
		);

		$map_marker_repeater->add_control(
			'map_marker_icon_width',
			[
				'label' => esc_html__( 'Icon Width', 'elementskit' ),
				'type' => Controls_Manager::NUMBER,
				'default' => esc_html__( '32', 'elementskit' ),
				'condition' => [
					'map_marker_icon_enable' => 'yes'
				]
			]
		);

		$map_marker_repeater->add_control(
			'map_marker_icon_height',
			[
				'label' => esc_html__( 'Icon Height', 'elementskit' ),
				'type' => Controls_Manager::NUMBER,
				'default' => esc_html__( '32', 'elementskit' ),
				'condition' => [
					'map_marker_icon_enable' => 'yes'
				]
			]
		);

		$this->add_control(
			'map_markers',
			[
				'type' => Controls_Manager::REPEATER,
				'seperator' => 'before',
				'default' => [
					[ 
						'map_marker_title' => esc_html__( 'Daffodil International University', 'elementskit' ),
						'map_marker_lat' => esc_html__( '23.754539', 'elementskit' ),
						'map_marker_lng' => esc_html__( '90.3769106', 'elementskit' ),
					],
					[ 
						'map_marker_title' => esc_html__( 'National Parliament House', 'elementskit' ),
						'map_marker_lat' => esc_html__( '23.7626233', 'elementskit' ),
						'map_marker_lng' => esc_html__( '90.3777502', 'elementskit' ),
					],
				],
				'fields' => $map_marker_repeater->get_controls(),
				'title_field' => '{{map_marker_title}}',
			]
		);
		$this->end_controls_section();


		
		$this->start_controls_section(
			'ekit_section_google_map_polyline_settings',
			[
				'label' => esc_html__( 'Coordinate Settings', 'elementskit' ),
				'condition' => [
					'map_type' => ['polyline', 'polygon']
				]
			]
		);

		$coordinate_repeater = new Repeater();

		$coordinate_repeater->add_control(
			'map_polyline_title',
			[
				'label' => esc_html__( 'Title', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => true,
				'default' => esc_html__( '#', 'elementskit' ),
			]
		);

		$coordinate_repeater->add_control(
			'map_polyline_lat',
			[
				'label' => esc_html__( 'Latitude', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => true,
				'default' => esc_html__( '28.948790', 'elementskit' ),
			]
		);

		$coordinate_repeater->add_control(
			'map_polyline_lng',
			[
				'label' => esc_html__( 'Longitude', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => true,
				'default' => esc_html__( '-81.298843', 'elementskit' ),
			]
		);

		$this->add_control(
			'map_polylines',
			[
				'type' => Controls_Manager::REPEATER,
				'seperator' => 'before',
				'default' => [
					[ 
                        'map_polyline_title' => esc_html__( '#1', 'elementskit' ),
                        'map_polyline_lat' => esc_html__( '23.749981', 'elementskit' ),
                        'map_polyline_lng' => esc_html__( '90.365641', 'elementskit' ),
                    ],
					[ 
                        'map_polyline_title' => esc_html__( '#2', 'elementskit' ),
                        'map_polyline_lat' => esc_html__( '23.7416692', 'elementskit' ),
                        'map_polyline_lng' => esc_html__( '90.3622266', 'elementskit' ),
                    ],
					[ 
                        'map_polyline_title' => esc_html__( '#3', 'elementskit' ),
                        'map_polyline_lat' => esc_html__( '23.7514466', 'elementskit' ),
                        'map_polyline_lng' => esc_html__( '90.3967484', 'elementskit' ),
                    ],
				],
				'fields' => $coordinate_repeater->get_controls(),
				'title_field' => '{{map_polyline_title}}',
			]
		);

		$this->end_controls_section();

		
		$this->start_controls_section(
				'ekit_section_google_map_routes_settings',
				[
					'label' => esc_html__( 'Routes Coordinate Settings', 'elementskit' ),
					'condition' => [
						'map_type' => ['routes']
					]
				]
			);
		$this->add_control(
			'map_routes_origin',
			[
				'label' => esc_html__( 'Origin', 'elementskit' ),
				'type' => Controls_Manager::HEADING,
				'separator' => 'after',
			]
		);
		$this->add_control(
			'map_routes_origin_lat',
			[
				'label' => esc_html__( 'Latitude', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => false,
				'default' => esc_html__( '28.948790', 'elementskit' ),
			]
		);
		$this->add_control(
			'map_routes_origin_lng',
			[
				'label' => esc_html__( 'Longitude', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => false,
				'default' => esc_html__( '-81.298843', 'elementskit' ),
			]
		);
		$this->add_control(
			'map_routes_dest',
			[
				'label' => esc_html__( 'Destination', 'elementskit' ),
				'type' => Controls_Manager::HEADING,
				'separator' => 'after',
			]
		);

		$this->add_control(
			'map_routes_dest_lat',
			[
				'label' => esc_html__( 'Latitude', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => false,
				'default' => esc_html__( '1.2833808', 'elementskit' ),
			]
		);

		$this->add_control(
			'map_routes_dest_lng',
			[
				'label' => esc_html__( 'Longitude', 'elementskit' ),
				'type' => Controls_Manager::TEXT,
				'label_block' => false,
				'default' => esc_html__( '103.8585377', 'elementskit' ),
			]
		);

		$this->add_control(
				'map_routes_travel_mode',
				[
					'label'       	=> esc_html__( 'Travel Mode', 'elementskit' ),
				'type' 			=> Controls_Manager::SELECT,
				'default' 		=> 'walking',
				'label_block' 	=> false,
				'options' 		=> [
					'walking'  	=> esc_html__( 'Walking', 'elementskit' ),
					'bicycling' => esc_html__( 'Bicycling', 'elementskit' ),
					'driving' 	=> esc_html__( 'Driving', 'elementskit' ),
				]
				]
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'section_map_controls',
			[
				'label'	=> esc_html__( 'Controls', 'elementskit' )
			]
		);
		$this->add_control(
			'map_zoom',
			[
				'label' => esc_html__( 'Zoom Level', 'elementskit' ),
				'type' => Controls_Manager::NUMBER,
				'label_block' => false,
				'default' => esc_html__( '14', 'elementskit' ),
			]
		);
		$this->add_control(
			'ekit_map_streeview_control',
			[
				'label'                 => esc_html__( 'Street View Controls', 'elementskit' ),
				'type'                  => Controls_Manager::SWITCHER,
				'default'               => 'true',
				'label_on'              => __( 'On', 'elementskit' ),
				'label_off'             => __( 'Off', 'elementskit' ),
				'return_value'          => 'true',
			]
		);
		$this->add_control(
			'ekit_map_type_control',
			[
				'label'                 => esc_html__( 'Map Type Control', 'elementskit' ),
				'type'                  => Controls_Manager::SWITCHER,
				'default'               => 'yes',
				'label_on'              => __( 'On', 'elementskit' ),
				'label_off'             => __( 'Off', 'elementskit' ),
				'return_value'          => 'yes',
			]
		);

		$this->add_control(
			'ekit_map_zoom_control',
			[
				'label'                 => esc_html__( 'Zoom Control', 'elementskit' ),
				'type'                  => Controls_Manager::SWITCHER,
				'default'               => 'yes',
				'label_on'              => __( 'On', 'elementskit' ),
				'label_off'             => __( 'Off', 'elementskit' ),
				'return_value'          => 'yes',
			]
		);

		$this->add_control(
			'ekit_map_fullscreen_control',
			[
				'label'                 => esc_html__( 'Fullscreen Control', 'elementskit' ),
				'type'                  => Controls_Manager::SWITCHER,
				'default'               => 'yes',
				'label_on'              => __( 'On', 'elementskit' ),
				'label_off'             => __( 'Off', 'elementskit' ),
				'return_value'          => 'yes',
			]
		);

		$this->add_control(
			'ekit_map_scroll_zoom',
			[
				'label'                 => esc_html__( 'Scroll Wheel Zoom', 'elementskit' ),
				'type'                  => Controls_Manager::SWITCHER,
				'default'               => 'yes',
				'label_on'              => __( 'On', 'elementskit' ),
				'label_off'             => __( 'Off', 'elementskit' ),
				'return_value'          => 'yes',
			]
		);
		$this->end_controls_section();
			
		
		$this->start_controls_section(
			'ekit_section_google_map_theme_settings',
			[
				'label'		=> esc_html__( 'Theme', 'elementskit' ),
				'condition' => [
					'map_type!'	=> ['static', 'panorama']
				]
			]
		);
		$this->add_control(
			'map_theme_source',
			[
				'label'		=> __( 'Theme Source', 'elementskit' ),
				'type'		=> Controls_Manager::CHOOSE,
				'options' => [
					'gstandard' => [
						'title' => __( 'Google Standard', 'elementskit' ),
						'icon' => 'fa fa-map',
					],
					'snazzymaps' => [
						'title' => __( 'Snazzy Maps', 'elementskit' ),
						'icon' => 'fa fa-map-marker',
					],
					'custom' => [
						'title' => __( 'Custom', 'elementskit' ),
						'icon' => 'fa fa-edit',
					],
				],
				'default'	=> 'gstandard'
			]
		);
		$this->add_control(
			'map_gstandards',
			[
				'label'                 => esc_html__( 'Google Themes', 'elementskit' ),
				'type'                  => Controls_Manager::SELECT,
				'default'               => 'standard',
				'options'               => [
					'standard'     => __( 'Standard', 'elementskit' ),
					'silver'       => __( 'Silver', 'elementskit' ),
					'retro'        => __( 'Retro', 'elementskit' ),
					'dark'         => __( 'Dark', 'elementskit' ),
					'night'        => __( 'Night', 'elementskit' ),
					'aubergine'    => __( 'Aubergine', 'elementskit' )
				],
				'description'           => sprintf( '<a href="https://mapstyle.withgoogle.com/" target="_blank">%1$s</a> %2$s',__( 'Click here', 'elementskit' ), __( 'to generate your own theme and use JSON within Custom style field.', 'elementskit' ) ),
				'condition'	=> [
					'map_theme_source'	=> 'gstandard'
				]
			]
		);
		$this->add_control(
			'map_snazzymaps',
			[
				'label'                 => esc_html__( 'SnazzyMaps Themes', 'elementskit' ),
				'type'                  => Controls_Manager::SELECT,
				'label_block'			=> true,
				'default'               => 'colorful',
				'options'               => [
					'default'		=> __( 'Default', 'elementskit' ),
					'simple'		=> __( 'Simple', 'elementskit' ),
					'colorful'		=> __( 'Colorful', 'elementskit' ),
					'complex'		=> __( 'Complex', 'elementskit' ),
					'dark'			=> __( 'Dark', 'elementskit' ),
					'greyscale'		=> __( 'Greyscale', 'elementskit' ),
					'light'			=> __( 'Light', 'elementskit' ),
					'monochrome'	=> __( 'Monochrome', 'elementskit' ),
					'nolabels'		=> __( 'No Labels', 'elementskit' ),
					'twotone'		=> __( 'Two Tone', 'elementskit' )
				],
				'description'           => sprintf( '<a href="https://snazzymaps.com/explore" target="_blank">%1$s</a> %2$s',__( 'Click here', 'elementskit' ), __( 'to explore more themes and use JSON within custom style field.', 'elementskit' ) ),
				'condition'	=> [
					'map_theme_source'	=> 'snazzymaps'
				]
			]
		);
		$this->add_control(
			'map_custom_style',
			[
				'label'                 => __( 'Custom Style', 'elementskit' ),
				'description'           => sprintf( '<a href="https://mapstyle.withgoogle.com/" target="_blank">%1$s</a> %2$s',__( 'Click here', 'elementskit' ), __( 'to get JSON style code to style your map', 'elementskit' ) ),
				'type'                  => Controls_Manager::TEXTAREA,
				'condition'             => [
					'map_theme_source'     => 'custom',
				],
			]
		);
		$this->end_controls_section(); 
		
		
		$this->start_controls_section(
			'map_style_settings',
			[
				'label' => esc_html__( 'Map Container', 'elementskit' ),
				'tab' => Controls_Manager::TAB_STYLE,
			]
		);
		$this->add_responsive_control( 'map_max_width',
			[
				'label' => __( 'Width', 'elementskit' ),
				'type' => Controls_Manager::SLIDER,
				'default' => [
					'size' => 1140,
					'unit' => 'px',
				],
				'size_units' => [ 'px' ],
				'range' => [
					'px' => [
						'min' => 0,
						'max' => 1400,
						'step' => 10,
					]
				],
				'selectors' => [
					'{{WRAPPER}} .ekit-google-map' => 'max-width: {{SIZE}}{{UNIT}};',
				]
			]
		);
		$this->add_responsive_control( 'map_max_height',
			[
				'label' => __( 'Height', 'elementskit' ),
				'type' => Controls_Manager::SLIDER,
				'default' => [
					'size' => 400,
					'unit' => 'px',
				],
				'size_units' => [ 'px' ],
				'range' => [
					'px' => [
						'min' => 0,
						'max' => 1400,
						'step' => 10,
					]
				],
				'selectors' => [
					'{{WRAPPER}} .ekit-google-map' => 'height: {{SIZE}}{{UNIT}};',
				]
			]
		);

		$this->add_control( 'map_alignment',
			[
				'label' => __( 'Alignment', 'elementskit' ),
				'type' => Controls_Manager::CHOOSE,
				'default' => 'center',
				'options' => [
					'left' => [
						'title' => __( 'Left', 'elementskit' ),
						'icon' => 'eicon-text-align-left',
					],
					'center' => [
						'title' => __( 'Center', 'elementskit' ),
						'icon' => 'eicon-text-align-center',
					],
					'right' => [
						'title' => __( 'Right', 'elementskit' ),
						'icon' => 'eicon-text-align-right',
					],
				]
			]
		);

		$this->end_controls_section();


		$this->start_controls_section(
			'map_overlay_style_settings',
			[
				'label' => esc_html__( 'Overlay Style', 'elementskit' ),
				'tab' => Controls_Manager::TAB_STYLE,
				'condition' => [
					'map_type' => ['overlay']
				]
			]
		);
		$this->add_responsive_control(
			'map_overlay_width',
			[
				'label' => __( 'Width', 'elementskit' ),
				'type' => Controls_Manager::SLIDER,
				'default' => [
					'size' => 200,
					'unit' => 'px',
				],
				'size_units' => [ 'px' ],
				'range' => [
					'px' => [
						'min' => 0,
						'max' => 1100,
						'step' => 10,
					]
				],
				'selectors' => [
					'{{WRAPPER}} .ekit-gmap-overlay' => 'width: {{SIZE}}{{UNIT}};',
				]
			]
		);
		$this->add_control(
			'map_overlay_bg_color',
			[
				'label' => esc_html__( 'Background Color', 'elementskit' ),
				'type' => Controls_Manager::COLOR,
				'default' => '#fff',
				'selectors' => [
					'{{WRAPPER}} .ekit-gmap-overlay' => 'background-color: {{VALUE}};',
				],
			]
		);
		$this->add_responsive_control(
			'mapoverlay_padding',
			[
				'label' => esc_html__( 'Padding', 'elementskit' ),
				'type' => Controls_Manager::DIMENSIONS,
				'size_units' => [ 'px', 'em', '%' ],
				'selectors' => [
						'{{WRAPPER}} .ekit-gmap-overlay' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				],
			]
		);
		$this->add_responsive_control(
			'map_overlay_margin',
			[
				'label' => esc_html__( 'Margin', 'elementskit' ),
				'type' => Controls_Manager::DIMENSIONS,
				'size_units' => [ 'px', 'em', '%' ],
				'selectors' => [
						'{{WRAPPER}} .ekit-gmap-overlay' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				],
			]
		);
		$this->add_group_control(
			Group_Control_Border::get_type(),
			[
				'name' => 'map_overlay_border',
				'label' => esc_html__( 'Border', 'elementskit' ),
				'selector' => '{{WRAPPER}} .ekit-gmap-overlay',
			]
		);
		$this->add_responsive_control(
			'map_overlay_border_radius',
			[
				'label' => esc_html__( 'Border Radius', 'elementskit' ),
				'type' => Controls_Manager::DIMENSIONS,
				'size_units' => [ 'px', 'em', '%' ],
				'selectors' => [
						'{{WRAPPER}} .ekit-gmap-overlay' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				],
			]
		);
		$this->add_group_control(
			Group_Control_Box_Shadow::get_type(),
			[
				'name' => 'map_overlay_box_shadow',
				'selector' => '{{WRAPPER}} .ekit-gmap-overlay',
			]
		);
		$this->add_group_control(
			Group_Control_Typography::get_type(),
			[
				'name' => 'map_overlay_typography',
				'selector' => '{{WRAPPER}} .ekit-gmap-overlay',
			]
		);
		$this->add_control(
			'map_overlay_color',
			[
				'label' => esc_html__( 'Color', 'elementskit' ),
				'type' => Controls_Manager::COLOR,
				'default' => '#222',
				'selectors' => [
					'{{WRAPPER}} .ekit-gmap-overlay' => 'color: {{VALUE}};',
				],
			]
		);
		$this->end_controls_section();

		
		$this->start_controls_section(
			'ekit_section_google_map_stroke_style_settings',
			[
				'label' => esc_html__( 'Stroke Style', 'elementskit' ),
				'tab' => Controls_Manager::TAB_STYLE,
				'condition' => [
					'map_type' => ['polyline', 'polygon', 'routes']
				]
			]
		);
		$this->add_control(
			'map_stroke_color',
			[
				'label' => esc_html__( 'Color', 'elementskit' ),
				'type' => Controls_Manager::COLOR,
				'default' => '#e23a47',
			]
		);
		$this->add_responsive_control(
			'map_stroke_opacity',
			[
				'label' => __( 'Opacity', 'elementskit' ),
				'type' => Controls_Manager::SLIDER,
				'default' => [
					'size' => 0.8,
				],
				'size_units' => [ 'px' ],
				'range' => [
					'px' => [
						'min' => 0.2,
						'max' => 1,
						'step' => 0.1,
					]
				],
			]
		);
		$this->add_responsive_control(
			'map_stroke_weight',
			[
				'label' => __( 'Weight', 'elementskit' ),
				'type' => Controls_Manager::SLIDER,
				'default' => [
					'size' => 4,
				],
				'size_units' => [ 'px' ],
				'range' => [
					'px' => [
						'min' => 1,
						'max' => 10,
						'step' => 1,
					]
				],
			]
		);
		$this->add_control(
			'map_stroke_fill_color',
			[
				'label' => esc_html__( 'Fill Color', 'elementskit' ),
				'type' => Controls_Manager::COLOR,
				'default' => '#e23a47',
				'condition' => [
					'map_type' => ['polygon']
				]
			]
		);
		$this->add_responsive_control(
			'map_stroke_fill_opacity',
			[
				'label' => __( 'Fill Opacity', 'elementskit' ),
				'type' => Controls_Manager::SLIDER,
				'default' => [
					'size' => 0.4,
				],
				'size_units' => [ 'px' ],
				'range' => [
					'px' => [
						'min' => 0.2,
						'max' => 1,
						'step' => 0.1,
					]
				],
				'condition' => [
					'map_type' => ['polygon']
				]
			]
		);
		$this->end_controls_section();


	}

	protected function ekit_get_map_theme($settings) {

		if($settings['map_theme_source'] == 'custom') {
			return strip_tags($settings['map_custom_style']);
		}else {
			$themes = include('google-map-themes.php');
			if(isset($themes[$settings['map_theme_source']][$settings['map_gstandards']])) {
				return $themes[$settings['map_theme_source']][$settings['map_gstandards']];
			}elseif(isset($themes[$settings['map_theme_source']][$settings['map_snazzymaps']])) {
				return $themes[$settings['map_theme_source']][$settings['map_snazzymaps']];
			}else {
				return '';
			}
		}

	}

	protected function map_render_data_attributes( $settings ) {

		extract($settings);

		return [
			'data-map_type'						=> isset($map_type)							? esc_attr($map_type) 								:	'',
			'data-map_address_type'				=> isset($map_address_type)					? esc_attr($map_address_type)						:	'',
			'data-map_lat'						=> isset($map_lat)							? esc_attr($map_lat)								:	'',
			'data-map_lng'						=> isset($map_lng)							? esc_attr($map_lng)								:	'',
			'data-map_addr'						=> isset($map_addr)							? esc_attr($map_addr)								:	'',
			'data-map_basic_marker_title'		=> isset($map_basic_marker_title)			? esc_attr($map_basic_marker_title)					:	'',
			'data-map_basic_marker_content'		=> isset($map_basic_marker_content)			? esc_attr($map_basic_marker_content)				:	'',
			'data-map_basic_marker_icon_enable'	=> isset($map_basic_marker_icon_enable)		? esc_attr($map_basic_marker_icon_enable)			:	'',
			'data-map_basic_marker_icon'		=> isset($map_basic_marker_icon) 			? esc_attr($map_basic_marker_icon['url']) 			:	'',
			'data-map_basic_marker_icon_width'	=> isset($map_basic_marker_icon_width) 		? esc_attr($map_basic_marker_icon_width['size'])	:	'',
			'data-map_basic_marker_icon_height'	=> isset($map_basic_marker_icon_height)		? esc_attr($map_basic_marker_icon_height['size'])	:	'',
			'data-map_zoom'						=> isset($map_zoom)							? esc_attr($map_zoom)								:	'',
			'data-map_marker_content'			=> isset($map_marker_content)				? esc_attr($map_marker_content) 					:	'',
			'data-map_static_width'				=> isset($map_static_width)					? esc_attr($map_static_width['size'])				:	'',
			'data-map_static_height'			=> isset($map_static_height)				? esc_attr($map_static_height['size'])				:	'',
			//'data-map_static_lat'				=> isset($map_static_lat)					? esc_attr($map_static_lat)							:	'',
			//'data-map_static_lng'				=> isset($map_static_lng)					? esc_attr($map_static_lng)							:	'',
			'data-map_stroke_color'				=> isset($map_stroke_color)					? esc_attr($map_stroke_color)						:	'',
			'data-map_stroke_opacity'			=> isset($map_stroke_opacity)				? esc_attr($map_stroke_opacity['size'])				:	'',
			'data-map_stroke_weight'			=> isset($map_stroke_weight)				? esc_attr($map_stroke_weight['size'])				:	'',
			'data-map_stroke_fill_color'		=> isset($map_stroke_fill_color)			? esc_attr($map_stroke_fill_color)					:	'',
			'data-map_stroke_fill_opacity'		=> isset($map_stroke_fill_opacity)			? esc_attr($map_stroke_fill_opacity['size'])		:	'',
			'data-map_overlay_content'			=> isset($map_overlay_content)				? esc_attr($map_overlay_content)					:	'',
			'data-map_routes_origin_lat'		=> isset($map_routes_origin_lat)			? esc_attr($map_routes_origin_lat)					:	'',
			'data-map_routes_origin_lng'		=> isset($map_routes_origin_lng)			? esc_attr($map_routes_origin_lng)					:	'',
			'data-map_routes_dest_lat'			=> isset($map_routes_dest_lat)				? esc_attr($map_routes_dest_lat)					:	'',
			'data-map_routes_dest_lng'			=> isset($map_routes_dest_lng)				? esc_attr($map_routes_dest_lng)					:	'',
			'data-map_routes_travel_mode'		=> isset($map_routes_travel_mode)			? esc_attr($map_routes_travel_mode)					:	'',
			'data-map_panorama_lat'				=> isset($map_panorama_lat)					? esc_attr($map_panorama_lat)						:	'',
			'data-map_panorama_lng'				=> isset($map_panorama_lng)					? esc_attr($map_panorama_lng)						:	'',

			'data-map_theme'					=> urlencode(json_encode($this->ekit_get_map_theme($settings))),
			'data-map_markers'					=> urlencode(json_encode($map_markers)),
			'data-map_polylines'				=> urlencode(json_encode($map_polylines)),

			'data-map_streeview_control'		=> isset($ekit_map_streeview_control) 	&& $ekit_map_streeview_control 			? 'true': 'false',
			'data-map_type_control'				=> isset($ekit_map_type_control) 		&& $ekit_map_type_control 				? 'true': 'false',
			'data-map_zoom_control'				=> isset($ekit_map_zoom_control) 		&& $ekit_map_zoom_control 				? 'true': 'false',
			'data-map_fullscreen_control'		=> isset($ekit_map_fullscreen_control) 	&& $ekit_map_fullscreen_control 		? 'true': 'false',
			'data-map_scroll_zoom'				=> isset($ekit_map_scroll_zoom) 		&& $ekit_map_scroll_zoom 				? 'true': 'false'
		];
	}

	protected function get_map_render_data_attribute_string($settings) {

		$data_attributes = $this->map_render_data_attributes($settings);
		$data_string = '';

		foreach( $data_attributes as $key => $value ) {
			if( isset($key) && ! empty($value)) {
				$data_string .= ' '.$key.'="'.$value.'"';
			}
		}
		return $data_string;
	}

	protected function get_alignment( $align ){
		if( $align == 'left' ) { return ''; }
		return $align == 'center' 
			? esc_attr('margin-left:auto;margin-right:auto;text-align:center;' )
			: esc_attr('margin-left:auto;margin-right:0;text-align:right;');
	}
    
    protected function render() {
		echo '<div class="ekit-wid-con" >';
		$this->render_raw();
		echo '</div>';
	}

	protected function render_raw() {

		$settings = $this->get_settings_for_display();
        $user_data = Attr::instance()->utils->get_option('user_data', []);

		$hasApiKey = !empty($user_data['google_map']) && '' != $user_data['google_map']['api_key'];

		$this->add_render_attribute( 'map_wrap', [
			'class'					=> ['ekit-google-map'],
			'id'					=> 'ekit-google-map-'.esc_attr($this->get_id()),
			'data-id'				=> esc_attr($this->get_id()),
			'data-api_key'			=> $hasApiKey ? esc_attr($user_data['google_map']['api_key']) : '',
			'style'					=> $this->get_alignment($settings['map_alignment'])
		]);
	?>

	<?php if( ! empty($settings['map_type']) ) : ?>
		<div <?php echo $this->get_render_attribute_string('map_wrap'), $this->get_map_render_data_attribute_string($settings); ?>></div>
	<?php endif; ?>
		<div class="google-map-notice"></div>
	<?php

	}

}
