package com.narutohuo.xindazhou.common.networkrx

/**
 * RxJava API响应封装
 * 
 * 统一封装网络响应，支持RxJava链式调用
 * 
 * 功能：
 * - 统一的响应格式
 * - 支持成功和失败状态
 * - 与RxJava无缝集成
 * 
 * 使用方式：
 * ```kotlin
 * apiService.login(request)
 *     .compose(RxApiResponseTransformer())
 *     .subscribe({
 *         // 处理成功
 *     }, {
 *         // 处理错误
 *     })
 * ```
 */

/**
 * API响应基类
 */
sealed class RxApiResponse<out T> {
    
    /**
     * 成功响应
     * 
     * @param data 响应数据
     */
    data class Success<T>(val data: T) : RxApiResponse<T>()
    
    /**
     * 错误响应
     * 
     * @param code 错误码
     * @param message 错误消息
     * @param error 原始错误
     */
    data class Error<T>(
        val code: Int,
        val message: String,
        val error: Throwable? = null
    ) : RxApiResponse<T>()
}

/**
 * 通用响应数据结构
 * 
 * 适用于大多数API响应格式
 */
data class RxCommonResponse<T>(
    val code: Int,
    val message: String,
    val data: T?
) {
    /**
     * 是否成功
     */
    val isSuccess: Boolean
        get() = code == 0
}

/**
 * API响应转换器
 * 
 * 将通用响应转换为RxApiResponse
 */
object RxApiResponseConverter {
    
    /**
     * 转换通用响应
     * 
     * @param response 通用响应
     * @return RxApiResponse
     */
    fun <T> convert(response: RxCommonResponse<T>): RxApiResponse<T> {
        return if (response.isSuccess) {
            if (response.data != null) {
                RxApiResponse.Success(response.data)
            } else {
                RxApiResponse.Error(
                    code = -1,
                    message = "数据为空",
                    error = NullPointerException("Response data is null")
                )
            }
        } else {
            RxApiResponse.Error(
                code = response.code,
                message = response.message
            )
        }
    }
    
    /**
     * 转换异常
     * 
     * @param throwable 异常
     * @return RxApiResponse.Error
     */
    fun <T> convertError(throwable: Throwable): RxApiResponse.Error<T> {
        return RxApiResponse.Error(
            code = -1,
            message = throwable.message ?: "网络错误",
            error = throwable
        )
    }
}
