import { useState, useRef, useCallback, useEffect } from 'react';
import { generateImage, checkTaskStatus } from '../../api/client';

/**
 * 画像生成とポーリングを行うカスタムフック
 */
export const usePixaliaGenerator = () => {
    const [status, setStatus] = useState('idle'); // idle, generating, polling, completed, error
    const [generatedImage, setGeneratedImage] = useState(null); // Pixalia側のURL
    const [error, setError] = useState(null);
    const [taskId, setTaskId] = useState(null);

    const timerRef = useRef(null);

    // ポーリング停止関数
    const stopPolling = useCallback(() => {
        if (timerRef.current) {
            clearInterval(timerRef.current);
            timerRef.current = null;
        }
    }, []);

    // アンマウント時にタイマー解除
    useEffect(() => {
        return () => stopPolling();
    }, [stopPolling]);

    // 生成プロセス開始
    const startGeneration = useCallback(async (params, nonce) => {
        setStatus('generating');
        setError(null);
        setGeneratedImage(null);

        try {
            // 1. 生成リクエスト (POST)
            const response = await generateImage(params, nonce);
            if (!response || response.status === 'error' || !response.data.task_uuid) {
                // PHP側からエラーメッセージが来ている場合はそれを使う
                const errorMsg = response?.error?.message || 'Failed to start generation (No Task UUID).';
                throw new Error(errorMsg);
            }

            const uuid = response.data.task_uuid;

            if (!uuid) {
                throw new Error('Task IDが取得できませんでした。');
            }

            setTaskId(uuid);
            setStatus('polling');

            // 2. ポーリング開始 (5秒間隔)
            timerRef.current = setInterval(async () => {
                try {
                    const statusRes = await checkTaskStatus(uuid, nonce);
                    // {
                    //     "success": true,
                    //     "data": {
                    //     "status": "success",
                    //         "data": {
                    //         "task_id": "545e1186-fdea-45b4-83ee-1dd80e56fee2",
                    //             "job_status": "failed",
                    //             "result": null,
                    //             "error": {
                    //             "code": "api_image_generate_job_error",
                    //                 "message": "\u753b\u50cf\u306e\u751f\u6210\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u6642\u9593\u3092\u7f6e\u3044\u3066\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002"
                    //         }
                    //     },
                    //     "error": null
                    // }
                    // }
                    if (statusRes.data.job_status === 'completed') {
                        stopPolling();
                        setStatus('completed');
                        setGeneratedImage(statusRes.data.result.image_url); // 一時的なURL
                    } else if (statusRes.data.job_status === 'failed') {
                        stopPolling();
                        setStatus('error');
                        const msg = statusRes.data.error?.message || '生成に失敗しました。';
                        setError(msg);
                    }
                    // processing, pending の場合は継続
                } catch (e) {
                    stopPolling();
                    setStatus('error');
                    setError(e.message);
                }
            }, 5000);

        } catch (e) {
            stopPolling();
            setStatus('error');
            setError(e.message);
        }
    }, [stopPolling]);

    const cancel = useCallback(() => {
        stopPolling();
        setStatus('idle');
        setGeneratedImage(null);
    }, [stopPolling]);

    return {
        status,
        generatedImage,
        error,
        taskId,
        startGeneration,
        cancel
    };
};