syntax = "proto3";

package backup;

import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";
import "google/api/annotations.proto";
import "protoc-gen-openapiv2/options/annotations.proto";

option go_package = "pkg/service/backup/;backup";

service BackupService {
    // 149
    rpc List (BackupListReq) returns (Backups) {
        option (google.api.http) = {
            get: "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/backups"
        };
        option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
            operation_id: "ListBackups"
        };
    }

	rpc CreateBackupSchedule (BackupCreateReq) returns (BackupScheduleId) {
        option (google.api.http) = {
            post: "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/backups/schedules"
            body: "*"
        };
        option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
            operation_id: "CreateBackupSchedule"
        };
    }

    rpc GetAutoSetting (AutoBackupSettingReq) returns (AutoBackupSetting) {
        option (google.api.http) = {
            get: "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/backups/schedules"
        };
        option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
            operation_id: "GetAutoBackupSetting"
        };
    }

    rpc Delete (BackupReq) returns (google.protobuf.Empty) {
        option (google.api.http) = {
            delete: "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/backups/{id}"
        };
        option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
            operation_id: "DeleteBackup"
        };
    }

    rpc Restore (BackupRestoreReq) returns (RestoreResp) {
        option (google.api.http) = {
            post: "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/backups/{id}/restore"
            body: "*"
        };
        option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
            operation_id: "RestoreBackup"
        };
    }

    rpc DeleteDeletedClusterAndBackups (ClusterIdReq) returns (google.protobuf.Empty) {
        option (google.api.http) = {
            delete: "/api/v1/orgs/{org_id}/projects/{project_id}/recycle-bin/{cluster_id}/backups"
        };
        option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
            operation_id: "DeleteDeletedClusterAndBackups"
        };
    }
}


// message BackupCreateResp

message BackupListReq {
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
        json_schema: {
            required: ["cluster_id", "page", "per_page", "org_id", "project_id"]
        }
    };

    uint64 cluster_id = 1;
    uint32 page = 2;
    uint32 per_page = 3;
	uint64 org_id = 4;
    uint64 project_id = 5;
}

message BackupRestoreReq {
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
        json_schema: {
            required: ["id", "cluster_id", "cluster_name", "description", "password", "org_id", "project_id"]
        }
    };

    uint64 id = 1;
    uint64 cluster_id = 2;
    string cluster_name = 3;
    string description = 4;
    string password = 5;
	uint64 org_id = 6;
    uint64 project_id = 7;
}

message BackupCreateReq {
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
        json_schema: {
            required: ["cluster_id", "description", "name", "org_id", "backup_type", "backup_time", "max_backups", "backup_mode", "project_id"]
        }
    };

    uint64 cluster_id = 1;
    string description = 2;
    string name = 3;
	uint64 org_id = 4;
	BackupType backup_type = 5;
	string backup_time = 6;
    uint64 max_backups = 7;
    BackupMode backup_mode = 8;
    uint64 project_id = 9;
}

message AutoBackupSettingReq {
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
        json_schema: {
            required: ["cluster_id", "org_id", "project_id"]
        }
    };

    uint64 cluster_id = 1;
	uint64 org_id = 2;
    uint64 project_id = 3;
}

message AutoBackupSetting {
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
        json_schema: {
            required: ["backup_mode", "backup_time", "max_backups"]
        }
    };

    BackupMode backup_mode = 1;
    string backup_time = 2;
    uint64 max_backups = 3;
}

message BackupScheduleId {
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
        json_schema: {
            required: ["id"]
        }
    };

    uint64 id = 1;
}

message BackupReq {
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
        json_schema: {
            required: ["id", "cluster_id", "org_id", "project_id"]
        }
    };

    uint64 id = 1;
    uint64 cluster_id = 2;
	uint64 org_id = 3;
    uint64 project_id = 4;
}

message BackupCluster {
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
        json_schema: {
            required: ["cluster_id", "tidb_count", "tikv_count", "tiflash_count"]
        }
    };

    uint64 cluster_id = 1;
    uint32 tidb_count = 2;
    uint32 tikv_count = 3;
    uint32 tiflash_count = 4;
}

enum BackupMode {
    FULL = 0;
}

enum BackupType {
    AUTO = 0;
    MANUAL = 1;
    ALL = 2;
}

message Backup {
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
        json_schema: {
            required: ["id", "cluster", "name", "description", "created_at", "size", "status", "type", "expiration_time"]
        }
    };

    uint64 id = 1;
    BackupCluster cluster = 2;
    string name = 3;
    string description = 4;
    google.protobuf.Timestamp created_at = 5;
    uint64 size = 6;
    enum Status {
        UNKNOWN = 0;
        RUNNING = 1;
        SUCCESS = 2;
        FAILED = 3;
        PENDING = 4;
    }
    Status status = 7;
    BackupType type = 8;
    google.protobuf.Timestamp expiration_time = 9;
}

message Backups {
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
        json_schema: {
            required: ["items", "total"]
        }
    };

    repeated Backup items = 1;
    uint32 total = 2;
}


message RestoreId {
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
        json_schema: {
            required: ["id", "org_id"]
        }
    };

    uint64 id = 1;
	uint64 org_id = 2;
}

message RestoreResp {
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
        json_schema: {
            required: ["id", "cluster_id", "org_id"]
        }
    };

    uint64 id = 1;
    uint64 cluster_id = 2;
	uint64 org_id = 3;
}

message ClusterIdReq {
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
        json_schema: {
            required: ["org_id", "project_id", "cluster_id"]
        }
    };

	uint64 org_id = 1;
    uint64 project_id = 2;
    uint64 cluster_id = 3;
}