package com.narutohuo.xindazhou.common.network

import android.util.Log
import retrofit2.Response

/**
 * API 通用响应结果
 * 对应后端 CommonResult<T>
 * 
 * 所有API响应的统一包装格式
 */
data class ApiCommonResult<T>(
    val code: Int,
    val msg: String?,
    val data: T?
)

/**
 * API响应解析器
 * 
 * 统一处理 Retrofit Response，将 Response<ApiCommonResult<T>> 转换为 Result<T>
 */
object ApiResponseParser {
    
    /**
     * 业务成功码
     */
    private const val SUCCESS_CODE = 0
    
    /**
     * 处理网络响应
     * 
     * @param response Retrofit Response
     * @param dataClass 数据类型的 Class（用于类型转换）
     * @param tag 日志标签（用于日志记录）
     * @param errorMessage 错误消息前缀
     * @return Result<T> 成功返回数据，失败返回异常
     */
    fun <T> handleResponse(
        response: Response<ApiCommonResult<T>>,
        dataClass: Class<T>,
        tag: String = "ApiResponseParser",
        errorMessage: String = "请求失败"
    ): Result<T> {
        return try {
            // 1. 检查HTTP状态码
            if (!response.isSuccessful) {
                val errorMsg = response.message() ?: errorMessage
                Log.w(tag, "HTTP请求失败，code=${response.code()}")
                return Result.failure(Exception(errorMsg))
            }
            
            // 2. 获取响应体
            val commonResult = response.body()
            if (commonResult == null) {
                // 尝试读取原始响应体以便调试
                val errorBody = response.errorBody()?.string() ?: "null"
                Log.e(tag, "响应体为空，errorBody=$errorBody")
                return Result.failure(Exception("响应体为空"))
            }
            
            Log.d(tag, "响应体解析成功: code=${commonResult.code}, msg=${commonResult.msg}, data类型=${commonResult.data?.javaClass?.simpleName ?: "null"}")
            
            // 3. 检查业务状态码
            if (commonResult.code != SUCCESS_CODE) {
                val errorMsg = commonResult.msg ?: "$errorMessage (code: ${commonResult.code})"
                Log.w(tag, "业务失败，code=${commonResult.code}, msg=$errorMsg")
                return Result.failure(Exception(errorMsg))
            }
            
            // 4. 提取业务数据（Gson 已经处理好了类型转换）
            val data = commonResult.data
            if (data == null) {
                Log.e(tag, "服务器返回数据为空: code=${commonResult.code}, msg=${commonResult.msg}")
                return Result.failure(Exception("服务器返回数据为空"))
            }
            
            Log.d(tag, "请求成功: data类型=${data?.javaClass?.simpleName ?: "null"}")
            Result.success(data)
            
        } catch (e: Exception) {
            Log.e(tag, "处理响应异常", e)
            Result.failure(e)
        }
    }
    
    /**
     * 处理网络响应（支持可空数据）
     * 
     * @param response Retrofit Response
     * @param tag 日志标签
     * @param errorMessage 错误消息前缀
     * @return Result<T?> 成功返回数据（可能为null），失败返回异常
     */
    fun <T> handleNullableResponse(
        response: Response<ApiCommonResult<T>>,
        tag: String = "ApiResponseParser",
        errorMessage: String = "请求失败"
    ): Result<T?> {
        return try {
            if (!response.isSuccessful) {
                val errorMsg = response.message() ?: errorMessage
                Log.w(tag, "HTTP请求失败，code=${response.code()}")
                return Result.failure(Exception(errorMsg))
            }
            
            val commonResult = response.body() 
                ?: return Result.failure(Exception("响应体为空"))
            
            if (commonResult.code != SUCCESS_CODE) {
                val errorMsg = commonResult.msg ?: "$errorMessage (code: ${commonResult.code})"
                Log.w(tag, "业务失败，code=${commonResult.code}")
                return Result.failure(Exception(errorMsg))
            }
            
            // 允许data为null
            Log.d(tag, "请求成功")
            Result.success(commonResult.data)
            
        } catch (e: Exception) {
            Log.e(tag, "处理响应异常", e)
            Result.failure(e)
        }
    }
}

