<?php if ( !defined( 'ABSPATH' ) ) exit;//PHPの宣言と直接アクセスの拒否

/***** メディアライブラリ一覧でEXIFを削除するボタンプログラム *****/
/* EXIFがある画像に対してはホーバー時に個別に削除ボタンを表示 */
/* 一括削除も可能 */
/*** 共通処理関数 ***/
if ( ! function_exists( 'haup_process_exif_removal' ) ) {
	function haup_process_exif_removal( $post_id ) {
		$file_path = get_attached_file( $post_id );

		if ( ! $file_path || ! file_exists( $file_path ) ) return false;

		$editor = wp_get_image_editor( $file_path );

		if ( is_wp_error( $editor ) ) return false;

		if ( $editor instanceof WP_Image_Editor_Magick ) {
			try {
				$imagick = $editor->get_imagick();
				$target_patterns = [
					'/exif:GPS.*/i', '/exif:.*SerialNumber/i', '/exif:Artist/i',
					'/exif:Copyright/i', '/exif:UserComment/i', '/exif:ImageDescription/i'
				];

				foreach ( $target_patterns as $pattern ) {
					$imagick->pregReplaceImageProfiles( $pattern, '' );
				}
				$editor->save( $file_path );
			} catch ( Exception $e ) { return false; }
		} elseif ( $editor instanceof WP_Image_Editor_GD ) {
			$editor->set_quality( 90 );
			$editor->save( $file_path );
		}

		return true;
	}
}

/*** 2. EXIFの有無を精密に判定するヘルパー関数 ***/
if ( ! function_exists( 'haup_has_exif_data' ) ) {
	function haup_has_exif_data( $post_id ) {
		$file_path = get_attached_file( $post_id );

		if ( ! $file_path || ! file_exists( $file_path ) ) return false;

		$mime = get_post_mime_type( $post_id );
        
		// JPEGの場合：標準関数で「意味のあるデータ」があるか精査
		if ( $mime === 'image/jpeg' ) {
			$exif = @exif_read_data( $file_path );
            
			// 単に配列があるかだけでなく、主要な項目（カメラ名や日時）が入っているか
			if ( ! empty( $exif ) ) {
				$check_keys = array('Make', 'Model', 'DateTime', 'Software', 'GPSLatitude');

				foreach ( $check_keys as $key ) {
					if ( isset( $exif[$key] ) ) return true;
				}
			}
		}

		// WebPやその他の場合、または標準関数で取れなかった場合
		// バイナリを読み込み、Exif識別子の直後に続くデータが「空」でないか簡易チェック
		$handle = fopen( $file_path, 'rb' );

		if ( $handle ) {
			$header = fread( $handle, 1024 ); // 先頭1KBで十分
			fclose( $handle );
            
			// "Exif"文字列があり、かつその直後がヌルデータだけでないことを確認
			// (一部のソフトが残す「空のEXIF枠」を除外するため)
			if ( strpos( $header, 'Exif' ) !== false ) {
				// ここでは「Exif」が見つかれば一旦「あり」と判定するが、
				// 上記JPEG判定を抜けてきた場合のみ実行される
				return ( $mime === 'image/jpeg' ) ? false : true; 
			}
		}

		return false;
	}
}

/*** UI関連のフック処理 ***/
/* メディア一覧の行にボタン追加（EXIFがある場合のみ） */
function haup_add_delete_exif_action_button( $actions, $post ){
	$text = __('EXIF removal','hima-art-utility');
	
	// 画像かつEXIFデータが存在する場合のみ「EXIF削除」を表示
	if ( strpos( $post->post_mime_type, 'image' ) !== false && haup_has_exif_data( $post->ID ) ) {
		$url = wp_nonce_url( admin_url( 'admin-post.php?action=manual_remove_exif&id=' . $post->ID ),'remove_exif_nonce' );

		$actions['remove_exif'] = '<a href="' . $url . '" style="color: #d63638;">'.esc_html( $text ).'</a>';
	}

	return $actions;
}
add_filter('media_row_actions','haup_add_delete_exif_action_button', 10, 2 );

/* 一括操作メニューに追加（一括操作は常に表示でOKですが、処理内で判定されます） */
function haup_add_bulk_delete_exif_action_menu( $bulk_actions ){
	$bulk_actions['bulk_remove_exif'] = __('Remove EXIF ​​information','hima-art-utility');

	return $bulk_actions;
}
add_filter('bulk_actions-upload','haup_add_bulk_delete_exif_action_menu');

/*** 実行処理 ***/
/* 個別ボタン用 */
function haup_delete_exif_by_media_library(){
	check_admin_referer( 'remove_exif_nonce' );

	$post_id = isset( $_GET['id'] ) ? intval( $_GET['id'] ) : 0;

	if ( $post_id && current_user_can( 'edit_post', $post_id ) ) {
		haup_process_exif_removal( $post_id );
	}

	wp_safe_redirect( admin_url( 'upload.php?exif_removed=1' ) );

	exit;
}
add_action('admin_post_manual_remove_exif','haup_delete_exif_by_media_library');

/* 一括操作用 */
function haup_bulk_delete_exif_by_media_library( $redirect_to, $action, $post_ids ){
	if ( $action !== 'bulk_remove_exif' ) return $redirect_to;

	$count = 0;

	foreach ( $post_ids as $post_id ) {
		// EXIFがある場合のみ実行
		if ( haup_has_exif_data( $post_id ) && haup_process_exif_removal( $post_id ) ) {
			$count++;
		}
	}

	return add_query_arg( 'exif_removed', $count, $redirect_to );
}
add_filter('handle_bulk_actions-upload','haup_bulk_delete_exif_by_media_library', 10, 3 );

/* EXIF情報削除後にメッセージを表示 */
function haup_exif_removed_notice(){
	$message = __('EXIF information removed','hima-art-utility');

	if ( ! empty( $_GET['exif_removed'] ) ) {
		echo '<div class="updated notice is-dismissible"><p>'.esc_html( $message ).'</p></div>';
	}
}
add_action('admin_notices','haup_exif_removed_notice');