<?php
/**
 * Helper methods
 *
 * @package     Kirki
 * @category    Core
 * @author      Aristeides Stathopoulos
 * @copyright   Copyright (c) 2016, Aristeides Stathopoulos
 * @license     http://opensource.org/licenses/https://opensource.org/licenses/MIT
 * @since       1.0
 */

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

if ( ! class_exists( 'Kirki_Helper' ) ) {

	/**
	 * A simple object containing static methods.
	 */
	class Kirki_Helper {

		/**
		 * Recursive replace in arrays.
		 *
		 * @static
		 * @access public
		 * @param array $array The first array.
		 * @param array $array1 The second array.
		 * @return mixed
		 */
		public static function array_replace_recursive( $array, $array1 ) {
			if ( function_exists( 'array_replace_recursive' ) ) {
				return array_replace_recursive( $array, $array1 );
			}

			// Handle the arguments, merge one by one.
			$args  = func_get_args();
			$array = $args[0];
			if ( ! is_array( $array ) ) {
				return $array;
			}
			$count = count( $args );
			for ( $i = 1; $i < $count; $i++ ) {
				if ( is_array( $args[ $i ] ) ) {
					$array = self::recurse( $array, $args[ $i ] );
				}
			}
			return $array;
		}

		/**
		 * Helper method to be used from the array_replace_recursive method.
		 *
		 * @static
		 * @access public
		 * @param array $array The first array.
		 * @param array $array1 The second array.
		 * @return array
		 */
		public static function recurse( $array, $array1 ) {
			foreach ( $array1 as $key => $value ) {
				// Create new key in $array, if it is empty or not an array.
				if ( ! isset( $array[ $key ] ) || ( isset( $array[ $key ] ) && ! is_array( $array[ $key ] ) ) ) {
					$array[ $key ] = array();
				}

				// Overwrite the value in the base array.
				if ( is_array( $value ) ) {
					$value = self::recurse( $array[ $key ], $value );
				}
				$array[ $key ] = $value;
			}
			return $array;
		}

		/**
		 * Initialize the WP_Filesystem
		 */
		public static function init_filesystem() {
			global $wp_filesystem;
			if ( empty( $wp_filesystem ) ) {
				require_once( ABSPATH . '/wp-admin/includes/file.php' );
				WP_Filesystem();
			}
		}

		/**
		 * Returns the attachment object
		 *
		 * @param string $url URL to the image.
		 * @return int|string Numeric ID of the attachement.
		 */
		public static function get_image_id( $url ) {
			return url_to_postid( $url );
		}

		/**
		 * Returns an array of the attachment's properties.
		 *
		 * @param string $url URL to the image.
		 * @return array
		 */
		public static function get_image_from_url( $url ) {

			$image_id = self::get_image_id( $url );
			$image    = wp_get_attachment_image_src( $image_id, 'full' );

			return array(
				'url'       => $image[0],
				'width'     => $image[1],
				'height'    => $image[2],
				'thumbnail' => $image[3],
			);

		}

		/**
		 * Get an array of posts.
		 *
		 * @static
		 * @access public
		 * @param array $args Define arguments for the get_posts function.
		 * @return array
		 */
		public static function get_posts( $args ) {

			// Get the posts.
			$posts = get_posts( $args );

			// Properly format the array.
			$items = array();
			foreach ( $posts as $post ) {
				$items[ $post->ID ] = $post->post_title;
			}

			return $items;

		}

		/**
		 * Get an array of publicly-querable taxonomies.
		 *
		 * @static
		 * @access public
		 * @return array
		 */
		public static function get_taxonomies() {

			$items = array();

			// Get the taxonomies.
			$taxonomies = get_taxonomies( array( 'public' => true ) );

			// Build the array.
			foreach ( $taxonomies as $taxonomy ) {
				$id           = $taxonomy;
				$taxonomy     = get_taxonomy( $taxonomy );
				$items[ $id ] = $taxonomy->labels->name;
			}

			return $items;

		}

		/**
		 * Get an array of publicly-querable post-types.
		 *
		 * @static
		 * @access public
		 * @return array
		 */
		public static function get_post_types() {

			$items = array();

			// Get the post types.
			$post_types = get_post_types( array( 'public' => true ), 'objects' );

			// Build the array.
			foreach ( $post_types as $post_type ) {
				$items[ $post_type->name ] = $post_type->labels->name;
			}

			return $items;

		}

		/**
		 * Get an array of terms from a taxonomy
		 *
		 * @static
		 * @access public
		 * @param string|array $taxonomies See https://developer.wordpress.org/reference/functions/get_terms/ for details.
		 * @return array
		 */
		public static function get_terms( $taxonomies ) {

			$items = array();

			// Get the post types.
			$terms = get_terms( $taxonomies );

			// Build the array.
			foreach ( $terms as $term ) {
				$items[ $term->term_id ] = $term->name;
			}

			return $items;

		}

		/**
		 * Gets an array of material-design colors.
		 *
		 * @static
		 * @access public
		 * @param false|string $context Allows us to get subsets of the palette.
		 * @return array
		 */
		public static function get_material_design_colors( $context = false ) {

			$colors = array(
				'primary' => array(
					'#FFFFFF',
					'#000000',
					'#F44336',
					'#E91E63',
					'#9C27B0',
					'#673AB7',
					'#3F51B5',
					'#2196F3',
					'#03A9F4',
					'#00BCD4',
					'#009688',
					'#4CAF50',
					'#8BC34A',
					'#CDDC39',
					'#FFEB3B',
					'#FFC107',
					'#FF9800',
					'#FF5722',
					'#795548',
					'#9E9E9E',
					'#607D8B',
				),
				'red' => array(
					'#FFEBEE',
					'#FFCDD2',
					'#EF9A9A',
					'#E57373',
					'#EF5350',
					'#F44336',
					'#E53935',
					'#D32F2F',
					'#C62828',
					'#B71C1C',
					'#FF8A80',
					'#FF5252',
					'#FF1744',
					'#D50000',
				),
				'pink' => array(
					'#FCE4EC',
					'#F8BBD0',
					'#F48FB1',
					'#F06292',
					'#EC407A',
					'#E91E63',
					'#D81B60',
					'#C2185B',
					'#AD1457',
					'#880E4F',
					'#FF80AB',
					'#FF4081',
					'#F50057',
					'#C51162',
				),
				'purple' => array(
					'#F3E5F5',
					'#E1BEE7',
					'#CE93D8',
					'#BA68C8',
					'#AB47BC',
					'#9C27B0',
					'#8E24AA',
					'#7B1FA2',
					'#6A1B9A',
					'#4A148C',
					'#EA80FC',
					'#E040FB',
					'#D500F9',
					'#AA00FF',
				),
				'deep-purple' => array(
					'#EDE7F6',
					'#D1C4E9',
					'#B39DDB',
					'#9575CD',
					'#7E57C2',
					'#673AB7',
					'#5E35B1',
					'#512DA8',
					'#4527A0',
					'#311B92',
					'#B388FF',
					'#7C4DFF',
					'#651FFF',
					'#6200EA',
				),
				'indigo' => array(
					'#E8EAF6',
					'#C5CAE9',
					'#9FA8DA',
					'#7986CB',
					'#5C6BC0',
					'#3F51B5',
					'#3949AB',
					'#303F9F',
					'#283593',
					'#1A237E',
					'#8C9EFF',
					'#536DFE',
					'#3D5AFE',
					'#304FFE',
				),
				'blue' => array(
					'#E3F2FD',
					'#BBDEFB',
					'#90CAF9',
					'#64B5F6',
					'#42A5F5',
					'#2196F3',
					'#1E88E5',
					'#1976D2',
					'#1565C0',
					'#0D47A1',
					'#82B1FF',
					'#448AFF',
					'#2979FF',
					'#2962FF',
				),
				'light_blue' => array(
					'#E1F5FE',
					'#B3E5FC',
					'#81D4fA',
					'#4fC3F7',
					'#29B6FC',
					'#03A9F4',
					'#039BE5',
					'#0288D1',
					'#0277BD',
					'#01579B',
					'#80D8FF',
					'#40C4FF',
					'#00B0FF',
					'#0091EA',
				),
				'cyan' => array(
					'#E0F7FA',
					'#B2EBF2',
					'#80DEEA',
					'#4DD0E1',
					'#26C6DA',
					'#00BCD4',
					'#00ACC1',
					'#0097A7',
					'#00838F',
					'#006064',
					'#84FFFF',
					'#18FFFF',
					'#00E5FF',
					'#00B8D4',
				),
				'teal' => array(
					'#E0F2F1',
					'#B2DFDB',
					'#80CBC4',
					'#4DB6AC',
					'#26A69A',
					'#009688',
					'#00897B',
					'#00796B',
					'#00695C',
					'#004D40',
					'#A7FFEB',
					'#64FFDA',
					'#1DE9B6',
					'#00BFA5',
				),
				'green' => array(
					'#E8F5E9',
					'#C8E6C9',
					'#A5D6A7',
					'#81C784',
					'#66BB6A',
					'#4CAF50',
					'#43A047',
					'#388E3C',
					'#2E7D32',
					'#1B5E20',
					'#B9F6CA',
					'#69F0AE',
					'#00E676',
					'#00C853',
				),
				'light-green' => array(
					'#F1F8E9',
					'#DCEDC8',
					'#C5E1A5',
					'#AED581',
					'#9CCC65',
					'#8BC34A',
					'#7CB342',
					'#689F38',
					'#558B2F',
					'#33691E',
					'#CCFF90',
					'#B2FF59',
					'#76FF03',
					'#64DD17',
				),
				'lime' => array(
					'#F9FBE7',
					'#F0F4C3',
					'#E6EE9C',
					'#DCE775',
					'#D4E157',
					'#CDDC39',
					'#C0CA33',
					'#A4B42B',
					'#9E9D24',
					'#827717',
					'#F4FF81',
					'#EEFF41',
					'#C6FF00',
					'#AEEA00',
				),
				'yellow' => array(
					'#FFFDE7',
					'#FFF9C4',
					'#FFF590',
					'#FFF176',
					'#FFEE58',
					'#FFEB3B',
					'#FDD835',
					'#FBC02D',
					'#F9A825',
					'#F57F17',
					'#FFFF82',
					'#FFFF00',
					'#FFEA00',
					'#FFD600',
				),
				'amber' => array(
					'#FFF8E1',
					'#FFECB3',
					'#FFE082',
					'#FFD54F',
					'#FFCA28',
					'#FFC107',
					'#FFB300',
					'#FFA000',
					'#FF8F00',
					'#FF6F00',
					'#FFE57F',
					'#FFD740',
					'#FFC400',
					'#FFAB00',
				),
				'orange' => array(
					'#FFF3E0',
					'#FFE0B2',
					'#FFCC80',
					'#FFB74D',
					'#FFA726',
					'#FF9800',
					'#FB8C00',
					'#F57C00',
					'#EF6C00',
					'#E65100',
					'#FFD180',
					'#FFAB40',
					'#FF9100',
					'#FF6D00',
				),
				'deep-orange' => array(
					'#FBE9A7',
					'#FFCCBC',
					'#FFAB91',
					'#FF8A65',
					'#FF7043',
					'#FF5722',
					'#F4511E',
					'#E64A19',
					'#D84315',
					'#BF360C',
					'#FF9E80',
					'#FF6E40',
					'#FF3D00',
					'#DD2600',
				),
				'brown' => array(
					'#EFEBE9',
					'#D7CCC8',
					'#BCAAA4',
					'#A1887F',
					'#8D6E63',
					'#795548',
					'#6D4C41',
					'#5D4037',
					'#4E342E',
					'#3E2723',
				),
				'grey' => array(
					'#FAFAFA',
					'#F5F5F5',
					'#EEEEEE',
					'#E0E0E0',
					'#BDBDBD',
					'#9E9E9E',
					'#757575',
					'#616161',
					'#424242',
					'#212121',
					'#000000',
					'#ffffff',
				),
				'blue-grey' => array(
					'#ECEFF1',
					'#CFD8DC',
					'#B0BBC5',
					'#90A4AE',
					'#78909C',
					'#607D8B',
					'#546E7A',
					'#455A64',
					'#37474F',
					'#263238',
				),
			);

			switch ( $context ) {

				case '50':
				case '100':
				case '200':
				case '300':
				case '400':
				case '500':
				case '600':
				case '700':
				case '800':
				case '900':
				case 'A100':
				case 'A200':
				case 'A400':
				case 'A700':
					if ( 'A100' === $context ) {
						$key = 10;
						unset( $colors['grey'] );
					} elseif ( 'A200' === $context ) {
						$key = 11;
						unset( $colors['grey'] );
					} elseif ( 'A400' === $context ) {
						$key = 12;
						unset( $colors['grey'] );
					} elseif ( 'A700' === $context ) {
						$key = 13;
						unset( $colors['grey'] );
					} else {
						$key = $context / 100;
					}
					unset( $colors['primary'] );
					$position_colors = array();
					foreach ( $colors as $color_family ) {
						if ( isset( $color_family[ $key ] ) ) {
							$position_colors[] = $color_family[ $key ];
						}
					}
					return $position_colors;
				case 'all':
					unset( $colors['primary'] );
					$all_colors = array();
					foreach ( $colors as $color_family ) {
						foreach ( $color_family as $color ) {
							$all_colors[] = $color;
						}
					}
					return $all_colors;
				case 'primary':
					return $colors['primary'];
				default:
					if ( isset( $colors[ $context ] ) ) {
						return $colors[ $context ];
					}
					return $colors['primary'];
			}
		}

		/**
		 * Get an array of all available dashicons.
		 *
		 * @static
		 * @access public
		 * @return array
		 */
		public static function get_dashicons() {

			$admin_menu = array(
				'menu',
				'admin-site',
				'dashboard',
				'admin-post',
				'admin-media',
				'admin-links',
				'admin-page',
				'admin-comments',
				'admin-appearance',
				'admin-plugins',
				'admin-users',
				'admin-tools',
				'admin-settings',
				'admin-network',
				'admin-home',
				'admin-generic',
				'admin-collapse',
				'filter',
				'admin-customizer',
				'admin-multisite',
			);

			$welcome_screen = array(
				'welcome-write-blog',
				'welcome-add-page',
				'welcome-view-site',
				'welcome-widgets-menus',
				'welcome-comments',
				'welcome-learn-more',
			);

			$post_formats = array(
				'format-aside',
				'format-image',
				'format-gallery',
				'format-video',
				'format-status',
				'format-quote',
				'format-chat',
				'format-audio',
				'camera',
				'images-alt',
				'images-alt2',
				'video-alt',
				'video-alt2',
				'video-alt3',
			);

			$media = array(
				'media-archive',
				'media-audio',
				'media-code',
				'media-default',
				'media-document',
				'media-interactive',
				'media-spreadsheet',
				'media-text',
				'media-video',
				'playlist-audio',
				'playlist-video',
				'controls-play',
				'controls-pause',
				'controls-forward',
				'controls-skipforward',
				'controls-back',
				'controls-skipback',
				'controls-repeat',
				'controls-volumeon',
				'controls-volumeoff',
			);

			$image_editing = array(
				'image-crop',
				'image-rotate',
				'image-rotate-left',
				'image-rotate-right',
				'image-flip-vertical',
				'image-flip-horizontal',
				'image-filter',
				'undo',
				'redo',
			);

			$tinymce = array(
				'editor-bold',
				'editor-italic',
				'editor-ul',
				'editor-ol',
				'editor-quote',
				'editor-alignleft',
				'editor-aligncenter',
				'editor-alignright',
				'editor-insertmore',
				'editor-spellcheck',
				'editor-expand',
				'editor-contract',
				'editor-kitchensink',
				'editor-underline',
				'editor-justify',
				'editor-textcolor',
				'editor-paste-word',
				'editor-paste-text',
				'editor-removeformatting',
				'editor-video',
				'editor-customchar',
				'editor-outdent',
				'editor-indent',
				'editor-help',
				'editor-strikethrough',
				'editor-unlink',
				'editor-rtl',
				'editor-break',
				'editor-code',
				'editor-paragraph',
				'editor-table',
			);

			$posts = array(
				'align-left',
				'align-right',
				'align-center',
				'align-none',
				'lock',
				'unlock',
				'calendar',
				'calendar-alt',
				'visibility',
				'hidden',
				'post-status',
				'edit',
				'trash',
				'sticky',
			);

			$sorting = array(
				'external',
				'arrow-up',
				'arrow-down',
				'arrow-right',
				'arrow-left',
				'arrow-up-alt',
				'arrow-down-alt',
				'arrow-right-alt',
				'arrow-left-alt',
				'arrow-up-alt2',
				'arrow-down-alt2',
				'arrow-right-alt2',
				'arrow-left-alt2',
				'sort',
				'leftright',
				'randomize',
				'list-view',
				'exerpt-view',
				'grid-view',
			);

			$social = array(
				'share',
				'share-alt',
				'share-alt2',
				'twitter',
				'rss',
				'email',
				'email-alt',
				'facebook',
				'facebook-alt',
				'googleplus',
				'networking',
			);

			$wordpress_org = array(
				'hammer',
				'art',
				'migrate',
				'performance',
				'universal-access',
				'universal-access-alt',
				'tickets',
				'nametag',
				'clipboard',
				'heart',
				'megaphone',
				'schedule',
			);

			$products = array(
				'wordpress',
				'wordpress-alt',
				'pressthis',
				'update',
				'screenoptions',
				'info',
				'cart',
				'feedback',
				'cloud',
				'translation',
			);

			$taxonomies = array(
				'tag',
				'category',
			);

			$widgets = array(
				'archive',
				'tagcloud',
				'text',
			);

			$notifications = array(
				'yes',
				'no',
				'no-alt',
				'plus',
				'plus-alt',
				'minus',
				'dismiss',
				'marker',
				'star-filled',
				'star-half',
				'star-empty',
				'flag',
				'warning',
			);

			$misc = array(
				'location',
				'location-alt',
				'vault',
				'shield',
				'shield-alt',
				'sos',
				'search',
				'slides',
				'analytics',
				'chart-pie',
				'chart-bar',
				'chart-line',
				'chart-area',
				'groups',
				'businessman',
				'id',
				'id-alt',
				'products',
				'awards',
				'forms',
				'testimonial',
				'portfolio',
				'book',
				'book-alt',
				'download',
				'upload',
				'backup',
				'clock',
				'lightbulb',
				'microphone',
				'desktop',
				'tablet',
				'smartphone',
				'phone',
				'index-card',
				'carrot',
				'building',
				'store',
				'album',
				'palmtree',
				'tickets-alt',
				'money',
				'smiley',
				'thumbs-up',
				'thumbs-down',
				'layout',
			);

			return array(
				'admin-menu'     => $admin_menu,
				'welcome-screen' => $welcome_screen,
				'post-formats'   => $post_formats,
				'media'          => $media,
				'image-editing'  => $image_editing,
				'tinymce'        => $tinymce,
				'posts'          => $posts,
				'sorting'        => $sorting,
				'social'         => $social,
				'wordpress_org'  => $wordpress_org,
				'products'       => $products,
				'taxonomies'     => $taxonomies,
				'widgets'        => $widgets,
				'notifications'  => $notifications,
				'misc'           => $misc,
			);

		}
	}
}
