/**
 * WordPressのAJAXエンドポイントにリクエストを送信するためのAPIクライアント
 */
const ajaxUrl = window.pixaliaPluginData.ajaxUrl;

/**
 * 指定された投稿IDのOGP関連データを取得します。
 *
 * @param {number} postId - 対象の投稿ID
 * @param {string} nonce  - セキュリティのためのnonce
 * @returns {Promise<object>} - OGPデータを含むオブジェクト
 * @throws {Error} - エラーが発生した場合
 */
export async function fetchOgpData(postId, nonce) {
    const formData = new FormData();
    formData.append('action', 'pixalia_get_ogp_data');
    formData.append('post_id', postId.toString());
    formData.append('nonce', nonce);

    return await _postRequest(formData);
}

/**
 * 現在のユーザーステータス（プラン、クレジット）を取得する
 * @param {string} nonce
 * @returns {Promise<object>}
 */
export async function fetchUserStatus(nonce) {
    const formData = new FormData();
    formData.append('action', 'pixalia_get_user_status');
    formData.append('nonce', nonce);

    return await _postRequest(formData);
}

/**
 * 設定（APIキー、デフォルト設定）を保存する
 * @param {string} apiKey
 * @param {string} style
 * @param {string} aspect
 * @param {string} nonce
 */
export async function saveApiKey(apiKey, style, aspect, nonce) {
    const formData = new FormData();
    formData.append('action', 'pixalia_save_api_key');
    formData.append('api_key', apiKey);
    formData.append('default_style', style);
    formData.append('default_aspect', aspect);
    formData.append('nonce', nonce);

    return await _postRequest(formData);
}

/**
 * 投稿のアイキャッチ画像未チェックの投稿総数を取得します。
 *
 * @param {string} nonce - セキュリティのためのnonce
 * @returns {Promise<object>} - { count: number }
 */
export async function fetchUncheckedCount(nonce) {
    const formData = new FormData();
    formData.append('action', 'pixalia_get_unchecked_count');
    formData.append('nonce', nonce);

    return await _postRequest(formData);
}

/**
 * 投稿のアイキャッチ画像未チェックの投稿を1まとまりで（50件など）処理します。
 *
 * @param {string} nonce - セキュリティのためのnonce
 * @returns {Promise<object>} - { processed: number, remaining: number }
 */
export async function runBulkCheckBatch(nonce) {
    const formData = new FormData();
    formData.append('action', 'pixalia_bulk_check_posts');
    formData.append('nonce', nonce);

    return await _postRequest(formData);
}

// --- ▼ ここから追加・新仕様用API ▼ ---

/**
 * 画像生成リクエストを送信する (非同期ジョブ開始・TaskID取得)
 *
 * @param {object} params - { title, content, style, aspect_ratio, target_type }
 * @param {string} nonce  - セキュリティ用nonce
 * @returns {Promise<object>} - { task_id: "uuid...", status: "pending" }
 */
export async function generateImage(params, nonce) {
    const formData = new FormData();
    // PHP側の実装に合わせてアクション名を調整してください。
    // ポーリング方式用にAPIを分けるか、既存の pixalia_generate_image の戻り値を変更するかによりますが、
    // ここでは分かりやすく既存と同じアクション名を指定しています。
    formData.append('action', 'pixalia_generate_image');

    formData.append('title', params.title || '');
    formData.append('content', params.content || '');
    formData.append('style', params.style || 'minimalist_flat');
    formData.append('aspect_ratio', params.aspect_ratio || '1');
    formData.append('target_type', params.target_type || 'featured');

    formData.append('nonce', nonce);

    return await _postRequest(formData);
}

/**
 * タスクの生成状況を確認する (ポーリング用)
 *
 * @param {string} taskId - UUID
 * @param {string} nonce
 * @returns {Promise<object>} - { job_status: "processing"|"completed"|"failed", result: {...} }
 */
export async function checkTaskStatus(taskId, nonce) {
    const formData = new FormData();
    formData.append('action', 'pixalia_check_task_status');
    formData.append('task_id', taskId);
    formData.append('nonce', nonce);

    return await _postRequest(formData);
}

/**
 * 生成された画像をWordPressのメディアライブラリに取り込み、投稿に紐付ける
 * (アイキャッチ設定、または記事内挿入用の画像としてDL)
 *
 * @param {number} postId - 投稿ID
 * @param {string} imageUrl - 生成された画像のURL
 * @param {string} nonce
 * @param {boolean} isFeatured - アイキャッチとして設定する場合はtrue
 * @returns {Promise<object>} - { attachment_id: 123, url: "..." }
 */
export async function attachImageToPost(postId, imageUrl, nonce, isFeatured = false) {
    const formData = new FormData();
    formData.append('action', 'pixalia_attach_image');
    formData.append('post_id', postId);
    formData.append('image_url', imageUrl);
    formData.append('is_featured', isFeatured ? '1' : '0');
    formData.append('nonce', nonce);

    return await _postRequest(formData);
}

// --- ▲ ここまで追加 ▲ ---

/**
 * 共通のPOSTリクエスト処理
 * @param {FormData} formData
 * @returns {Promise<object>}
 * @private
 */
async function _postRequest(formData) {
    try {
        const response = await fetch(ajaxUrl, {
            method: 'POST',
            body: formData,
        });

        if (!response.ok) {
            throw new Error(`サーバーエラーが発生しました (ステータス: ${response.status})`);
        }

        const data = await response.json();

        if (!data.success) {
            throw new Error(data.data && data.data.message ? data.data.message : '不明なエラーが発生しました。');
        }

        return data.data; // wp_send_json_success()で渡されたデータ部分
    } catch (error) {
        console.error('APIリクエストに失敗しました:', error);
        throw error;
    }
}