package com.ruoyi.jarvis.service;

import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.jarvis.domain.JDOrder;

import java.util.List;

/**
 * 腾讯文档服务接口
 * 
 * @author system
 */
public interface ITencentDocService {
    
    /**
     * 获取授权URL
     * 
     * @return 授权URL
     */
    String getAuthUrl();
    
    /**
     * 通过授权码获取访问令牌
     * 
     * @param code 授权码
     * @return 访问令牌信息
     */
    JSONObject getAccessTokenByCode(String code);
    
    /**
     * 刷新访问令牌
     * 
     * @param refreshToken 刷新令牌
     * @return 新的访问令牌信息
     */
    JSONObject refreshAccessToken(String refreshToken);
    
    /**
     * 将物流信息上传到腾讯文档表格
     * 
     * @param accessToken 访问令牌
     * @param fileId 文件ID
     * @param sheetId 工作表ID
     * @param orders 订单列表
     * @return 上传结果
     */
    JSONObject uploadLogisticsToSheet(String accessToken, String fileId, String sheetId, List<JDOrder> orders);
    
    /**
     * 将单个订单的物流信息追加到表格
     * 
     * @param accessToken 访问令牌
     * @param fileId 文件ID
     * @param sheetId 工作表ID
     * @param order 订单信息
     * @return 上传结果
     */
    JSONObject appendLogisticsToSheet(String accessToken, String fileId, String sheetId, Integer startRow, JDOrder order);
    
    /**
     * 读取表格数据
     * 
     * @param accessToken 访问令牌
     * @param fileId 文件ID
     * @param sheetId 工作表ID
     * @param range 范围
     * @return 表格数据
     */
    JSONObject readSheetData(String accessToken, String fileId, String sheetId, String range);
    
    /**
     * 写入表格数据
     * 
     * @param accessToken 访问令牌
     * @param fileId 文件ID
     * @param sheetId 工作表ID
     * @param range 范围，例如 "A1"
     * @param values 要写入的数据，二维数组格式
     * @return 写入结果
     */
    JSONObject writeSheetData(String accessToken, String fileId, String sheetId, String range, Object values);
    
    /**
     * 获取文件信息
     * 
     * @param accessToken 访问令牌
     * @param fileId 文件ID
     * @return 文件信息
     */
    JSONObject getFileInfo(String accessToken, String fileId);
    
    /**
     * 获取工作表列表
     * 
     * @param accessToken 访问令牌
     * @param fileId 文件ID
     * @return 工作表列表
     */
    JSONObject getSheetList(String accessToken, String fileId);

    /**
     * 获取指定工作表的行数（优先返回 rowCount-实际有数据的行数，其次 rowTotal）
     * 用于替代 Redis 上次记录的行数，决定批量填充的操作范围
     *
     * @param accessToken 访问令牌
     * @param fileId 文件ID
     * @param sheetId 工作表ID
     * @return rowCount/rowTotal，未找到或解析失败返回 0
     */
    int getSheetRowTotal(String accessToken, String fileId, String sheetId);
    
    /**
     * 获取用户信息
     * 
     * @param accessToken 访问令牌
     * @return 用户信息
     */
    JSONObject getUserInfo(String accessToken);
    
    /**
     * 批量更新表格（batchUpdate API）
     * 
     * @param accessToken 访问令牌
     * @param fileId 文件ID
     * @param requestBody batchUpdate 请求体，包含 requests 数组
     * @return 更新结果
     */
    JSONObject batchUpdate(String accessToken, String fileId, JSONObject requestBody);
}

