package com.narutohuo.xindazhou.common.auth.repository

import com.narutohuo.xindazhou.common.auth.datasource.local.AuthLocalDataSource
import com.narutohuo.xindazhou.common.auth.datasource.remote.AuthRemoteDataSource
import com.narutohuo.xindazhou.common.auth.model.LoginRequest
import com.narutohuo.xindazhou.common.auth.model.LoginResponse
import com.narutohuo.xindazhou.common.auth.model.RegisterRequest
import com.narutohuo.xindazhou.common.log.LogHelper
import com.narutohuo.xindazhou.common.network.ApiBaseRepository

/**
 * 认证数据仓库
 * 
 * 负责统一管理认证相关的数据获取和缓存
 * 
 * 继承 ApiBaseRepository，自动获得：
 * - 统一的错误处理
 * - 日志记录
 * - 数据转换扩展点
 */
class AuthRepository(
    private val remoteDataSource: AuthRemoteDataSource,
    private val localDataSource: AuthLocalDataSource
) : ApiBaseRepository() {
    
    /**
     * 用户登录
     * 
     * @param mobile 手机号
     * @param password 密码
     * @return 登录结果
     */
    suspend fun login(mobile: String, password: String): Result<LoginResponse> {
        val request = LoginRequest(mobile, password)
        
        // 从远程数据源获取数据
        val result = remoteDataSource.login(request)
        
        // 如果成功，保存到本地
        result.onSuccess { response ->
            localDataSource.saveToken(response)
            LogHelper.d("AuthRepository", "login: Token已保存")
        }
        
        // 如果失败，可以在这里添加额外的错误处理逻辑
        result.onFailure { throwable ->
            // 例如：记录日志、发送错误上报等
            handleError(throwable)
        }
        
        return result
    }
    
    /**
     * 用户注册
     * 
     * @param mobile 手机号
     * @param password 密码
     * @return 注册结果
     */
    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)
            LogHelper.d("AuthRepository", "register: Token已保存")
        }
        
        // 如果失败，可以在这里添加额外的错误处理逻辑
        result.onFailure { throwable ->
            handleError(throwable)
        }
        
        return result
    }
    
    /**
     * 刷新 Token
     * 
     * @param refreshToken 刷新令牌
     * @return 刷新结果（包含新的 accessToken 和 refreshToken）
     */
    suspend fun refreshToken(refreshToken: String): Result<LoginResponse> {
        // 从远程数据源获取数据
        val result = remoteDataSource.refreshToken(refreshToken)
        
        // 如果成功，保存到本地
        result.onSuccess { response ->
            localDataSource.saveToken(response)
            LogHelper.d("AuthRepository", "refreshToken: Token已刷新并保存")
        }
        
        // 如果失败，可以在这里添加额外的错误处理逻辑
        result.onFailure { throwable ->
            handleError(throwable)
        }
        
        return result
    }
}

