<?php
/**
 * @package Pods\Global\Functions\Media
 */
/**
 * Get the Attachment ID for a specific image field
 *
 * @param array|int|string $image The image field array, ID, or guid
 *
 * @return int Attachment ID
 *
 * @since 2.0.5
 */
function pods_image_id_from_field( $image ) {

	$id = 0;

	if ( ! empty( $image ) ) {
		if ( is_array( $image ) ) {
			if ( isset( $image[0] ) ) {
				$id = pods_image_id_from_field( $image[0] );
			} elseif ( isset( $image['ID'] ) ) {
				$id = $image['ID'];
			} elseif ( isset( $image['guid'] ) ) {
				$id = pods_image_id_from_field( $image['guid'] );
			} elseif ( isset( $image['id'] ) ) {
				$id = $image['id'];
			} else {
				$id = pods_image_id_from_field( current( $image ) );
			}
		} else {
			if ( false === strpos( $image, '.' ) && is_numeric( $image ) ) {
				$id = $image;

				$the_post_type = get_post_type( $id );

				if ( false === $the_post_type ) {
					$id = 0;
				} elseif ( 'attachment' !== $the_post_type ) {
					$id = get_post_thumbnail_id( $id );
				}
			} else {
				$guid = pods_query( "SELECT `ID` FROM @wp_posts WHERE `post_type` = 'attachment' AND `guid` = %s", array( $image ) );

				if ( ! empty( $guid ) ) {
					$id = $guid[0]->ID;
				}
			}
		}//end if
	}//end if

	$id = (int) $id;

	return $id;
}

/**
 * Get the <img> HTML for a specific image field
 *
 * @param array|int|string $image      The image field array, ID, or guid
 * @param string|array     $size       Image size to use
 * @param int              $default    Default image to show if image not found, can be field array, ID, or guid
 * @param string|array     $attributes <img> Attributes array or string (passed to wp_get_attachment_image
 * @param boolean          $force      Force generation of image (if custom size array provided)
 *
 * @return string <img> HTML or empty if image not found
 *
 * @since 2.0.5
 */
function pods_image( $image, $size = 'thumbnail', $default = 0, $attributes = '', $force = false ) {

	$html = '';

	$id = pods_image_id_from_field( $image );

	if ( 0 == $default ) {
		/**
		 * Filter for default value
		 *
		 * Use to set a fallback image to be used when the image passed to pods_image can not be found. Will only take effect if $default is not set.
		 *
		 * @since 2.3.19
		 *
		 * @param array|int|string $default Default image to show if image not found, can be field array, ID, or guid
		 */
		$default = apply_filters( 'pods_image_default', $default );
	}

	$default = pods_image_id_from_field( $default );

	if ( 0 < $id ) {
		if ( $force ) {
			$full = wp_get_attachment_image_src( $id, 'full' );
			$src  = wp_get_attachment_image_src( $id, $size );

			if ( 'full' !== $size && $full[0] == $src[0] ) {
				pods_image_resize( $id, $size );
			}
		}

		$html = wp_get_attachment_image( $id, $size, true, $attributes );
	}

	if ( empty( $html ) && 0 < $default ) {
		if ( $force ) {
			$full = wp_get_attachment_image_src( $default, 'full' );
			$src  = wp_get_attachment_image_src( $default, $size );

			if ( 'full' !== $size && $full[0] == $src[0] ) {
				pods_image_resize( $default, $size );
			}
		}

		$html = wp_get_attachment_image( $default, $size, true, $attributes );
	}

	return $html;
}

/**
 * Get the Image URL for a specific image field
 *
 * @param array|int|string $image   The image field array, ID, or guid
 * @param string|array     $size    Image size to use
 * @param int              $default Default image to show if image not found, can be field array, ID, or guid
 * @param boolean          $force   Force generation of image (if custom size array provided)
 *
 * @return string Image URL or empty if image not found
 *
 * @since 2.0.5
 */
function pods_image_url( $image, $size = 'thumbnail', $default = 0, $force = false ) {

	$url = '';

	$id      = pods_image_id_from_field( $image );
	$default = pods_image_id_from_field( $default );

	if ( 0 < $id ) {
		if ( $force ) {
			$full = wp_get_attachment_image_src( $id, 'full' );
			$src  = wp_get_attachment_image_src( $id, $size );

			if ( 'full' !== $size && $full[0] == $src[0] ) {
				pods_image_resize( $id, $size );
			}
		}

		$src = wp_get_attachment_image_src( $id, $size );

		if ( ! empty( $src ) ) {
			$url = $src[0];
		} else {
			// Handle non-images
			$attachment = get_post( $id );

			if ( ! preg_match( '!^image/!', get_post_mime_type( $attachment ) ) ) {
				$url = wp_get_attachment_url( $id );
			}
		}
	}//end if

	if ( empty( $url ) && 0 < $default ) {
		if ( $force ) {
			$full = wp_get_attachment_image_src( $default, 'full' );
			$src  = wp_get_attachment_image_src( $default, $size );

			if ( 'full' !== $size && $full[0] == $src[0] ) {
				pods_image_resize( $default, $size );
			}
		}

		$src = wp_get_attachment_image_src( $default, $size );

		if ( ! empty( $src ) ) {
			$url = $src[0];
		} else {
			// Handle non-images
			$attachment = get_post( $default );

			if ( ! preg_match( '!^image/!', get_post_mime_type( $attachment ) ) ) {
				$url = wp_get_attachment_url( $default );
			}
		}
	}//end if

	return $url;
}

/**
 * Import media from a specific URL, saving as an attachment
 *
 * @param string  $url         URL to media for import
 * @param int     $post_parent ID of post parent, default none
 * @param boolean $featured    Whether to set it as the featured (post thumbnail) of the post parent
 *
 * @return int Attachment ID
 *
 * @since 2.3.0
 */
function pods_attachment_import( $url, $post_parent = null, $featured = false ) {

	$filename = explode( '?', $url );
	$filename = $filename[0];

	$filename = explode( '#', $filename );
	$filename = $filename[0];

	$filename = substr( $filename, ( strrpos( $filename, '/' ) ) + 1 );

	$title = substr( $filename, 0, ( strrpos( $filename, '.' ) ) );

	$uploads = wp_upload_dir( current_time( 'mysql' ) );

	if ( ! ( $uploads && false === $uploads['error'] ) ) {
		return 0;
	}

	$filename = wp_unique_filename( $uploads['path'], $filename );
	$new_file = $uploads['path'] . '/' . $filename;

	$file_data = @file_get_contents( $url );

	if ( ! $file_data ) {
		return 0;
	}

	file_put_contents( $new_file, $file_data );

	$stat  = stat( dirname( $new_file ) );
	$perms = $stat['mode'] & 0000666;
	@chmod( $new_file, $perms );

	$wp_filetype = wp_check_filetype( $filename );

	if ( ! $wp_filetype['type'] || ! $wp_filetype['ext'] ) {
		return 0;
	}

	$attachment = array(
		'post_mime_type' => $wp_filetype['type'],
		'guid'           => $uploads['url'] . '/' . $filename,
		'post_parent'    => null,
		'post_title'     => $title,
		'post_content'   => '',
	);

	$attachment_id = wp_insert_attachment( $attachment, $new_file, $post_parent );

	if ( is_wp_error( $attachment_id ) ) {
		return 0;
	}

	require_once ABSPATH . 'wp-admin/includes/media.php';
	require_once ABSPATH . 'wp-admin/includes/image.php';

	wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $new_file ) );

	if ( 0 < $post_parent && $featured ) {
		update_post_meta( $post_parent, '_thumbnail_id', $attachment_id );
	}

	return $attachment_id;
}

/**
 * Resize an image on demand
 *
 * @param int          $attachment_id Attachment ID
 * @param string|array $size          Size to be generated
 *
 * @return boolean Image generation result
 *
 * @since 2.3.0
 */
function pods_image_resize( $attachment_id, $size ) {

	$size_data = array();

	if ( ! is_array( $size ) ) {
		// Basic image size string
		global $wp_image_sizes;

		if ( isset( $wp_image_sizes[ $size ] ) && ! empty( $wp_image_sizes[ $size ] ) ) {
			// Registered image size
			$size_data = $wp_image_sizes[ $size ];
		} elseif ( preg_match( '/[0-9]+x[0-9]+/', $size ) || preg_match( '/[0-9]+x[0-9]+x[0-1]/', $size ) ) {
			// Custom on-the-fly image size
			$size = explode( 'x', $size );

			$size_data = array(
				'width'  => (int) $size[0],
				'height' => (int) $size[1],
				'crop'   => (int) ( isset( $size[2] ) ? $size[2] : 1 ),
			);

			$size = $size_data['width'] . 'x' . $size_data['height'];
		}
	} elseif ( 2 <= count( $size ) ) {
		// Image size array
		if ( isset( $size['width'] ) ) {
			$size_data = $size;
		} else {
			$size_data = array(
				'width'  => (int) $size[0],
				'height' => (int) $size[1],
				'crop'   => (int) ( isset( $size[2] ) ? $size[2] : 1 ),
			);
		}

		$size = $size_data['width'] . 'x' . $size_data['height'];
	}//end if

	if ( empty( $size_data ) ) {
		return false;
	}

	require_once ABSPATH . 'wp-admin/includes/image.php';

	$attachment = get_post( $attachment_id );
	$file       = get_attached_file( $attachment_id );

	if ( $file && file_exists( $file ) ) {
		$metadata = wp_get_attachment_metadata( $attachment_id );

		if ( ! empty( $metadata ) && preg_match( '!^image/!', get_post_mime_type( $attachment ) ) && file_is_displayable_image( $file ) ) {
			$editor = wp_get_image_editor( $file );

			if ( ! is_wp_error( $editor ) ) {
				$metadata['sizes'] = array_merge( $metadata['sizes'], $editor->multi_resize( array( $size => $size_data ) ) );

				wp_update_attachment_metadata( $attachment_id, $metadata );

				return true;
			}
		}
	}

	return false;
}

/**
 * Output an audio field as a video player.
 *
 * @uses  wp_audio_shortcode()
 *
 * @since 2.5.0
 *
 * @param string|array $url  Can be a URL of the source file, or a Pods audio field.
 * @param bool|array   $args Optional. Additional arguments to pass to wp_audio_shortcode
 *
 * @return string
 */
function pods_audio( $url, $args = false ) {

	if ( is_array( $url ) ) {
		if ( ! is_null( pods_v( 'ID', $url ) ) ) {
			$id  = pods_v( 'ID', $url );
			$url = wp_get_attachment_url( $id );
		} else {
			return;
		}
	}

	$audio_args = array( 'src' => $url );

	if ( is_array( $args ) ) {
		$audio_args = array_merge( $audio_args, $args );
	}

	return wp_audio_shortcode( $audio_args );

}

/**
 * Output a video field as a video player.
 *
 * @uses  wp_video_shortcode()
 *
 * @since 2.5.0
 *
 * @param string|array $url  Can be a URL of the source file, or a Pods video field.
 * @param bool|array   $args Optional. Additional arguments to pass to wp_video_shortcode()
 *
 * @return string
 */
function pods_video( $url, $args = false ) {

	if ( is_array( $url ) ) {
		if ( ! is_null( pods_v( 'ID', $url ) ) ) {
			$id  = pods_v( 'ID', $url );
			$url = wp_get_attachment_url( $id );
		} else {
			return;
		}
	}

	$video_args = array( 'src' => $url );

	if ( is_array( $args ) ) {
		$video_args = array_merge( $video_args, $args );
	}

	return wp_video_shortcode( $video_args );

}
