syntax = "proto3";

package aimdk.protocol;

import "aimdk/protocol/common/header.proto";

/**
 * @brief SOTA 开始上传文件的请求
 */
message SotaStartFileUploadRequest {
    RequestHeader header = 1;
    int32 master_soc_index = 2;   // ota_master 所在 soc 的索引
    string file_name = 3;         // 文件名称
    string file_path = 4;         // 文件路径
    string file_hash = 5;         // 文件 hash
}

message SotaStartFileUploadResponse {
    enum SotaStartFileUploadReturnCode {
        SotaStartFileUploadReturnCode_Local = 0;               // 本地说明，master 和 slave 在同一个 soc 上，直接进行下一步就行，无需上传
        SotaStartFileUploadReturnCode_Remote = 1;              // 远程说明，master 和 slave 不在同一个 soc 上，需要上传
        SotaStartFileUploadReturnCode_Fail = 2;                // 在本地，由于某些原因，无法到达下一步
        SotaStartFileUploadReturnCode_Authorization_Fail = 3;  // 鉴权失败
    }
    
    ResponseHeader header = 1;
}

/**
 * @brief SOTA 上传文件
 */
message SotaUploadFileRequest {
    RequestHeader header = 1;
    string hash = 2;   // 文件切片的 hash
    int32 size = 3;    // 文件切片的大小
    bytes datas = 4;   // 文件切片
    int32 index = 5;
    int32 total = 6;
}

message SotaUploadFileResponse {
    enum SotaUploadFileReturnCode {
        SotaUploadFileReturnCode_Success = 0;       // 上传成功
        SotaUploadFileReturnCode_Fail = 1;          // 上传失败，对方不接受重试
        SotaUploadFileReturnCode_AcceptRetry = 2;   // 上传失败，对方接受重试
    }

    ResponseHeader header = 1;
}

/**
 * @brief SOTA 结束上传文件
 */
message SotaFinishFileUploadRequest {
    RequestHeader header = 1;
    string file_name = 2;
    string file_hash = 3;
    int32 total = 4;
}

message SotaFinishFileUploadResponse {
    enum SotaFinishFileUploadReturnCode {
        SotaFinishFileUploadReturnCode_Success = 0; // 上传成功
        SotaFinishFileUploadReturnCode_Fail = 1;    // 上传失败，对方不接受重试
        SotaUploadFileReturnCode_AcceptRetry = 2;   // 上传失败，对方接受重试
    }

    ResponseHeader header = 1;
}

/**
 * @brief SOTA 开始升级
 */
message SotaStartOTARequest {
    RequestHeader header = 1;

    // 当前版本号
    int64 current_version = 2;
}

message SotaStartOTAResponse {
    enum SotaStartOTAReturnCode {
        SotaStartOTAReturnCode_Success = 0;     // 开始升级
        SotaStartOTAReturnCode_Upgrading = 1;   // 正在升级中
        SotaStartOTAReturnCode_Refuse = 2;      // 拒绝升级，原因未知
    }

    ResponseHeader header = 1;
}

/**
 * @brief SOTA 继续升级
 */
message SotaContinueOTARequest {
    RequestHeader header = 1;

    // 当前版本号
    int64 current_version = 2;
}

message SotaContinueOTAResponse {
    enum SotaContinueOTAReturnCode {
        SotaContinueOTAReturnCode_Success = 0;      // 继续升级
        SotaContinueOTAReturnCode_Upgrading = 1;    // 正在升级中
        SotaContinueOTAReturnCode_Refuse = 2;       // 拒绝继续升级，原因未知
    }

    ResponseHeader header = 1;
}

/**
 * @brief SOTA 重新回滚
 */
message SotaRetryRollbackRequest {
    RequestHeader header = 1;

    // 当前版本号
    int64 current_version = 2;
}

message SotaRetryRollbackResponse {
    enum SotaRetryRollbackReturnCode {
        SotaRetryRollbackReturnCode_Success = 0;    // 重新回滚
        SotaRetryRollbackReturnCode_Upgrading = 1;  // 正在回滚中
        SotaRetryRollbackReturnCode_Refuse = 2;     // 拒绝回滚，原因未知
    }

    ResponseHeader header = 1;
};

/**
 * @brief SOTA 获取当前升级进度
 */
message GetCurrentSotaProcessRequest {
    RequestHeader header = 1;
}

message GetCurrentSotaProcessResponse {
    enum SotaStage {
        SotaStage_Idle = 0;
        SotaStage_Upgrading = 1;            // 升级中
        SotaStage_Upgrading_Success = 2;    // 升级成功
        SotaStage_Rollbacking = 3;          // 回滚中
        SotaStage_Rollbacking_Success = 4;  // 回滚成功
        SotaStage_Pause = 5;                // pause
        SotaStage_Failure = 6;              // failue
        SotaStage_WaitMasterSwitch = 7;     // 等待 master 统一切换命令
    }

    ResponseHeader header = 1;
    SotaStage stage = 2;
    uint32 process = 3;
    uint32 error_num = 4;
    string error_msg = 5;
}

/**
 * @brief 重置 SOTA 状态。
 * 
 * @details 在开始文件传输之前，需要查询 SOTA 的当前状态。
 * - 当 SOTA 处于以下状态时，可以进行状态重置：
 *   - Idle 状态
 *   - Pause 状态
 *   - Failure 状态
 *   - SotaStage_Upgrading_Success 状态
 *   - SotaStage_Rollbacking_Success 状态
 * - 如果 SOTA 处于以下状态，ota_master 将持续等待：
 *   - Upgrading 状态
 *   - Rollbacking 状态
 * 
 * @note aima 会重置 ota_master 的状态。
 */
 message ResetSotaStatusRequest {
    RequestHeader header = 1;
}


message ResetSotaStatusResponse {
    enum ResetSotaStatusReturnCode {
        ResetSotaStatusReturnCode_Success = 0;   // 重置成功
        ResetSotaStatusReturnCode_Fail = 1;      // 重置失败
    }

    ResponseHeader header = 1;
}

/**
 * @brief SOTA 执行 ota_master 的一条 bash 命令
 */
message SotaExecuteBashCommandRequest {
    RequestHeader header = 1;
    string command = 2;
}

message SotaExecuteBashCommandResponse {
    enum SotaExecuteBashCommandReturnCode {
        SotaExecuteBashCommandReturnCode_Success = 0;   // 执行成功
        SotaExecuteBashCommandReturnCode_Fail = 1;      // 执行失败
    }

    ResponseHeader header = 1;
    string result = 2;
}

/**
 * @brief SOTA 执行与 ota_master 规定好的脚本功能，要求功能是幂等的
 */
message SotaExecuteFunctionRequest {
    RequestHeader header = 1;
    int64 type = 2;
}

/**
 * @brief SOTA 执行与 ota_master 规定好的脚本功能
 */
message SotaExecuteFunctionResponse {
    ResponseHeader header = 1;
}

/**
 * @brief 获取当前执行脚本的进度
 */
message GetFunctionProgressRequest {
    RequestHeader header = 1;
    int64 type = 2;
}

/**
 * @brief 获取当前执行脚本的进度的返回值
 */
message GetFunctionProgressResponse {
  enum GetFunctionProgressReturnCode {
    GetFunctionProgressReturnCode_Success = 0;
    GetFunctionProgressReturnCode_Fail = 1;
    GetFunctionProgressReturnCode_Running = 2;
  }
  
  ResponseHeader header = 1;
  int32 progress = 2;
}

/**
 * @brief 获取 socx 的磁盘信息
 */
message GetSocxInfoRequest {
    RequestHeader header = 1;

    int64 type = 2;
}

/**
 * @brief 获取 socx 的信息的返回值
 */
message GetSocxInfoResponse {
    ResponseHeader header = 1;
    int64 type = 2;
    string info = 3;
}