import axios from 'axios';
import { toast } from 'react-toastify';
import { getLipSyncServer } from '../utils/lipSyncConfig';

// 从配置中获取服务器地址
const getServerUrl = () => {
  const serverConfig = getLipSyncServer();
  const serverUrl = serverConfig.apiUrl || serverConfig;
  // 移除末尾的斜杠，避免拼接时出现双斜杠
  return serverUrl.replace(/\/$/, '');
};

/**
 * 测试对口型服务器连接
 * @param {string} serverUrl - 服务器地址
 * @returns {Promise<{success: boolean, message: string}>} - 测试结果
 */
const testServer = async (serverUrl) => {
  try {
    // 测试服务器
    const response = await axios.get(`${serverUrl}/direct-lip-sync/`, {
      headers: {
        'accept': 'application/json, text/plain, */*',
        'origin': 'https://heygem.fyshark.com',
        'referer': 'https://heygem.fyshark.com/'
      },
      timeout: 5000 // 5秒超时
    });
    
    if (!response.data) {
      return { success: false, message: '服务器响应无效' };
    }
    
    return { success: true, message: '对口型服务器连接正常' };
  } catch (error) {
    console.error('测试对口型服务器失败:', error);
    return { 
      success: false, 
      message: `服务器连接失败: ${error.message}` 
    };
  }
};

/**
 * 提交对口型任务
 * @param {string} videoUrl 视频URL
 * @param {string} audioUrl 音频URL
 * @returns {Promise<{id: string}>} 任务信息
 */
const submitLipSyncTask = async (videoUrl, audioUrl) => {
  try {
    console.log('开始提交对口型任务...');
    console.log('视频URL:', videoUrl);
    console.log('音频URL:', audioUrl);

    // 获取服务器地址
    const serverUrl = getServerUrl();
    if (!serverUrl) {
      throw new Error('未配置对口型服务器地址');
    }

    // 构建请求数据
    const requestData = {
      video_url: videoUrl,
      audio_url: audioUrl
    };

    const apiUrl = `${serverUrl}/direct-lip-sync/`;
    console.log('发送对口型任务请求:', {
      url: apiUrl,
      data: requestData
    });

    // 发送POST请求获取任务ID
    const response = await axios.post(apiUrl, requestData, {
      headers: {
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'zh-CN,zh;q=0.9',
        'content-type': 'application/json',
        'origin': 'https://heygem.fyshark.com',
        'priority': 'u=1, i',
        'referer': 'https://heygem.fyshark.com/',
        'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"macOS"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'cross-site',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) jianyin_agent/2.4.3 Chrome/126.0.6478.234 Electron/31.7.6 Safari/537.36'
      }
    });

    console.log('对口型任务提交响应:', response.data);

    // 检查响应数据
    if (!response.data || !response.data.id) {
      console.error('对口型任务提交失败:', response.data);
      throw new Error('提交任务失败，未返回任务ID');
    }

    return {
      id: response.data.id
    };
  } catch (error) {
    console.error('提交对口型任务错误:', error);
    
    // 处理服务器忙碌的情况
    if (error.response && error.response.status === 500 && error.response.data && error.response.data.detail === '503: 服务器忙碌中，请稍后再试') {
      toast.error('服务器正在处理其他任务，请等待当前任务完成后再试');
      throw new Error('服务器正在处理其他任务，请等待当前任务完成后再试');
    }
    
    throw error;
  }
};

/**
 * 获取对口型任务信息
 * @param {string} taskId 任务ID
 * @returns {Promise<{status: string, progress: number, result_url?: string}>} 任务信息
 */
const getLipSyncTaskInfo = async (taskId) => {
  try {
    console.log('获取对口型任务信息:', taskId);

    // 获取服务器地址
    const serverUrl = getServerUrl();
    if (!serverUrl) {
      throw new Error('未配置对口型服务器地址');
    }

    const apiUrl = `${serverUrl}/direct-lip-sync/${taskId}`;
    console.log('获取对口型任务状态:', apiUrl);

    // 发送GET请求获取任务状态
    const response = await axios.get(apiUrl, {
      headers: {
        'accept': 'application/json, text/plain, */*',
        'content-type': 'application/json',
        'origin': 'https://heygem.fyshark.com',
        'referer': 'https://heygem.fyshark.com/',
        'sec-ch-ua': '"Chromium";v="134", "Not:A-Brand";v="24", "Google Chrome";v="134"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"macOS"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'cross-site',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'
      }
    });

    console.log('对口型任务状态响应:', response.data);

    // 检查响应数据
    if (!response.data) {
      throw new Error('获取任务状态失败，响应数据为空');
    }

    // 检查任务ID是否匹配
    if (response.data.id !== parseInt(taskId)) {
      throw new Error('未找到指定任务ID的信息');
    }

    // 转换状态码为状态文本
    let statusText = 'processing';
    if (response.data.status === 1) {
      statusText = 'processing';
    } else if (response.data.status === 2) {
      statusText = 'completed';
    } else if (response.data.status === 3) {
      statusText = 'failed';
    }

    // 如果有结果URL，拼接完整的下载地址
    let resultUrl = response.data.result_url;
    if (resultUrl) {
      // 确保路径以/开头
      const formattedPath = resultUrl.startsWith('/') ? resultUrl : `/${resultUrl}`;
      // 修改下载链接的端口为8383
      const downloadUrl = serverUrl.replace(/-80\./, '-8383.');
      resultUrl = `${downloadUrl}/download${formattedPath}`;
    }

    return {
      status: statusText,
      progress: response.data.progress || 0,
      result_url: resultUrl
    };
  } catch (error) {
    console.error('获取对口型任务信息失败:', error);
    throw error;
  }
};

/**
 * 获取对口型结果视频URL
 * @param {string} resultPath - 结果路径
 * @returns {string} - 完整的结果视频URL
 */
const getLipSyncResultUrl = (resultPath) => {
  if (!resultPath) return null;
  
  const serverUrl = getServerUrl();
  
  // 确保路径以/开头
  const formattedPath = resultPath.startsWith('/') ? resultPath : `/${resultPath}`;
  return `${serverUrl}/download${formattedPath}`;
};

/**
 * 处理对口型任务
 * @param {string} videoUrl 视频URL
 * @param {string} audioUrl 音频URL
 * @param {Function} onProgress 进度回调函数
 * @param {Function} onComplete 完成回调函数
 * @param {Function} onError 错误回调函数
 */
const processLipSyncTask = async (videoUrl, audioUrl, onProgress, onComplete, onError) => {
  try {
    console.log('开始处理对口型任务...');
    console.log('视频URL:', videoUrl);
    console.log('音频URL:', audioUrl);

    // 1. 提交任务
    const taskInfo = await submitLipSyncTask(videoUrl, audioUrl);
    console.log('对口型任务提交成功:', taskInfo);

    if (!taskInfo || !taskInfo.id) {
      throw new Error('提交任务失败，未返回任务ID');
    }

    // 2. 轮询任务状态
    const pollInterval = 5000; // 5秒
    const maxAttempts = 120; // 最多等待10分钟
    let attempts = 0;

    const pollTaskStatus = async () => {
      try {
        const statusInfo = await getLipSyncTaskInfo(taskInfo.id);
        console.log('对口型任务状态:', statusInfo);

        // 更新进度
        if (onProgress) {
          onProgress(statusInfo.progress, statusInfo.status);
        }

        // 检查任务状态
        if (statusInfo.status === 'completed') {
          if (onComplete) {
            onComplete(statusInfo.result_url, taskInfo);
          }
          return true;
        } else if (statusInfo.status === 'failed') {
          throw new Error('对口型任务处理失败');
        }

        // 继续轮询
        attempts++;
        if (attempts >= maxAttempts) {
          throw new Error('对口型任务超时');
        }

        // 等待一段时间后继续轮询
        await new Promise(resolve => setTimeout(resolve, pollInterval));
        return await pollTaskStatus();
      } catch (error) {
        console.error('轮询对口型任务状态失败:', error);
        throw error;
      }
    };

    // 开始轮询
    await pollTaskStatus();
  } catch (error) {
    console.error('处理对口型任务出错:', error);
    if (onError) {
      onError(error);
    }
  }
};

export default {
  submitLipSyncTask,
  getLipSyncTaskInfo,
  getLipSyncResultUrl,
  processLipSyncTask,
  testServer
}; 