syntax = "proto3";

package coda.admin.v1;

option java_package = "coda.admin.v1";
option java_outer_classname = "IdentityProto";

import "coda/admin/v1/types.proto";
import "coda/common/v1/types.proto";

service IdentityService {
  // List users within a tenant.
  rpc ListUsers(ListUsersRequest) returns (ListUsersResponse);

  // Get a single user's tenant membership.
  rpc GetUser(GetUserRequest) returns (TenantUserInfo);

  // Suspend a user within a tenant.
  rpc SuspendUser(SuspendUserRequest) returns (TenantUserInfo);

  // Reactivate a previously suspended user.
  rpc ReactivateUser(ReactivateUserRequest) returns (TenantUserInfo);

  // Deactivate a user (permanent removal from tenant).
  rpc DeactivateUser(DeactivateUserRequest) returns (TenantUserInfo);

  // Grant super-admin privileges to a user.
  rpc GrantSuperAdmin(GrantSuperAdminRequest) returns (SuperAdminInfo);

  // Revoke super-admin privileges from a user.
  rpc RevokeSuperAdmin(RevokeSuperAdminRequest) returns (RevokeSuperAdminResponse);

  // List all super-admins.
  rpc ListSuperAdmins(ListSuperAdminsRequest) returns (ListSuperAdminsResponse);
}

// ─── ListUsers ───────────────────────────────────────────────────────

message ListUsersRequest {
  string tenant_id = 1;
  coda.common.v1.PageRequest page = 2;
  TenantUserStatus status = 3;
}

message ListUsersResponse {
  repeated TenantUserInfo users = 1;
  coda.common.v1.PageInfo page = 2;
}

// ─── GetUser ─────────────────────────────────────────────────────────

message GetUserRequest {
  string tenant_id = 1;
  string user_id = 2;
}

// ─── SuspendUser ─────────────────────────────────────────────────────

message SuspendUserRequest {
  string tenant_id = 1;
  string user_id = 2;
  string reason = 3;
}

// ─── ReactivateUser ──────────────────────────────────────────────────

message ReactivateUserRequest {
  string tenant_id = 1;
  string user_id = 2;
}

// ─── DeactivateUser ──────────────────────────────────────────────────

message DeactivateUserRequest {
  string tenant_id = 1;
  string user_id = 2;
  string reason = 3;
}

// ─── GrantSuperAdmin ─────────────────────────────────────────────────

message GrantSuperAdminRequest {
  string user_id = 1;
  SuperAdminLevel level = 2;
  string granted_by = 3;
}

// ─── RevokeSuperAdmin ────────────────────────────────────────────────

message RevokeSuperAdminRequest {
  string user_id = 1;
  string revoked_by = 2;
}

message RevokeSuperAdminResponse {}

// ─── ListSuperAdmins ─────────────────────────────────────────────────

message ListSuperAdminsRequest {
  coda.common.v1.PageRequest page = 1;
}

message ListSuperAdminsResponse {
  repeated SuperAdminInfo admins = 1;
  coda.common.v1.PageInfo page = 2;
}
