<?php

namespace Pixalia\ImageAssistant\Service;

class MediaUploader {

	/**
	 * 外部URLから画像をダウンロードし、メディアライブラリに登録する
	 *
	 * @param string $image_url 画像のURL
	 * @param int|null $post_id 紐付ける投稿ID (任意)
	 * @param string|null $desc 画像の説明 (altテキストなど)
	 * @return int|\WP_Error 成功時はattachment_id, 失敗時はWP_Error
	 */
	public function upload_from_url( string $image_url, ?int $post_id = 0, ?string $desc = null ) {
		// WordPressのメディア関連関数をロード
		require_once( ABSPATH . 'wp-admin/includes/media.php' );
		require_once( ABSPATH . 'wp-admin/includes/file.php' );
		require_once( ABSPATH . 'wp-admin/includes/image.php' );

		// 1. URLから一時ファイルにダウンロード
		$tmp = download_url( $image_url );

		if ( is_wp_error( $tmp ) ) {
			return $tmp;
		}

		// 2. ファイル配列を作成
		$file_array = [
			'name'     => basename( wp_parse_url( $image_url, PHP_URL_PATH ) ), // ファイル名抽出
			'tmp_name' => $tmp,
		];

		// 拡張子がない場合のフォールバック
		if ( empty( pathinfo( $file_array['name'], PATHINFO_EXTENSION ) ) ) {
			$file_array['name'] .= '.png';
		}

		// 3. メディアライブラリに保存 (Sideload)
		// media_handle_sideload は内部で wp_insert_attachment 等を行ってくれる
		$attachment_id = media_handle_sideload( $file_array, $post_id, $desc );

		// エラーなら一時ファイルを削除して返す
		if ( is_wp_error( $attachment_id ) ) {
			wp_delete_file( $file_array['tmp_name'] );
			return $attachment_id;
		}

		return $attachment_id;
	}

	/**
	 * 指定された添付ファイルIDを、投稿のアイキャッチに設定する
	 */
	public function set_featured_image( int $post_id, int $attachment_id ) {
		return set_post_thumbnail( $post_id, $attachment_id );
	}
}
