package com.narutohuo.xindazhou.auth.repository

import com.narutohuo.xindazhou.auth.datasource.local.AuthLocalDataSource
import com.narutohuo.xindazhou.auth.datasource.remote.AuthRemoteDataSource
import com.narutohuo.xindazhou.auth.model.LoginRequest
import com.narutohuo.xindazhou.auth.model.LoginResponse
import com.narutohuo.xindazhou.auth.model.RegisterRequest
import com.narutohuo.xindazhou.core.log.ILog

/**
 * 认证数据仓库
 * 
 * ✅ 使用 AuthRemoteDataSource（它已经很好地封装了 Network 模块）
 * 
 * 职责：
 * 1. 协调远程数据源（AuthRemoteDataSource）和本地数据源（AuthLocalDataSource）
 * 2. 处理业务逻辑（保存 Token 等）
 * 
 * 调用流程：
 * ViewModel → AuthRepository → AuthRemoteDataSource → Network 模块
 * 
 * 使用方式：
 * ```kotlin
 * val repository = AuthRepository(
 *     remoteDataSource = AuthRemoteDataSourceImpl(),  // ← 使用 Network 模块
 *     localDataSource = AuthLocalDataSourceImpl()
 * )
 * val result = repository.login(mobile, password)
 * result.onSuccess { response -> /* 处理成功 */ }
 *        .onFailure { error -> /* 处理失败 */ }
 * ```
 */
class AuthRepository(
    private val remoteDataSource: AuthRemoteDataSource,  // ← 远程数据源（使用 Network 模块）
    private val localDataSource: AuthLocalDataSource     // ← 本地数据源（保存 Token）
) {
    
    private val TAG = "AuthRepository"
    
    /**
     * 用户登录
     * 
     * 流程：
     * 1. 接收参数（mobile, password）
     * 2. 转换为请求对象（LoginRequest）
     * 3. 调用远程数据源（AuthRemoteDataSource）发起网络请求
     * 4. 如果成功，保存 Token 到本地
     * 5. 返回结果
     * 
     * @param mobile 手机号
     * @param password 密码
     * @return 登录结果（包含 Token、用户信息等）
     */
    suspend fun login(mobile: String, password: String): Result<LoginResponse> {
        // 步骤1：转换为请求对象（Retrofit 需要对象，不能直接用多个参数）
        val request = LoginRequest(mobile, password)
        
        // 步骤2：调用远程数据源（它使用 Network 模块发起请求）
        val result = remoteDataSource.login(request)
        
        // 步骤3：如果成功，保存 Token 到本地
        result.onSuccess { response ->
            localDataSource.saveToken(response)
            ILog.d(TAG, "登录成功，Token已保存")
        }
        
        // 步骤4：返回结果
        return result
    }
    
    /**
     * 用户注册
     * 
     * 流程：同 login()
     */
    suspend fun register(mobile: String, password: String): Result<LoginResponse> {
        val request = RegisterRequest(mobile, password)
        val result = remoteDataSource.register(request)
        
        result.onSuccess { response ->
            localDataSource.saveToken(response)
            ILog.d(TAG, "注册成功，Token已保存")
        }
        
        return result
    }
    
    /**
     * 刷新 Token
     * 
     * 流程：
     * 1. 调用远程数据源刷新 Token
     * 2. 如果成功，保存新的 Token 到本地
     * 3. 返回结果
     * 
     * @param refreshToken 刷新令牌
     * @return 刷新结果（包含新的 accessToken 和 refreshToken）
     */
    suspend fun refreshToken(refreshToken: String): Result<LoginResponse> {
        val result = remoteDataSource.refreshToken(refreshToken)
        
        result.onSuccess { response ->
            localDataSource.saveToken(response)
            ILog.d(TAG, "Token刷新成功，已保存")
        }
        
        return result
    }
}
