syntax = "proto3";
package auth;

service AuthService {
  rpc TelegramMiniAppAuth (TelegramMiniAppAuthRequest) returns (AuthTokensResponse);
  rpc TelegramLoginWidgetAuth (TelegramLoginWidgetAuthRequest) returns (AuthTokensResponse);
  rpc GoogleAuthStart (GoogleAuthStartRequest) returns (GoogleAuthStartResponse);
  rpc GoogleAuthCallback (GoogleAuthCallbackRequest) returns (AuthExchangeCodeResponse);
  rpc ExchangeAuthCode (ExchangeAuthCodeRequest) returns (AuthTokensResponse);
  rpc GoogleAuth (GoogleAuthRequest) returns (AuthTokensResponse);
  rpc AppleAuth (AppleAuthRequest) returns (AuthTokensResponse);
  rpc RequestContactCode (ContactCodeRequest) returns (MessageResponse);
  rpc VerifyContactCode (ContactVerifyRequest) returns (AuthTokensResponse);
  rpc RefreshToken (RefreshTokenRequest) returns (AccessTokenResponse);
  rpc Logout (RefreshTokenRequest) returns (MessageResponse);
  rpc GetMe (AccessTokenRequest) returns (MeResponse);
  rpc AuthenticateTentaiUser (AuthenticateTentaiUserRequest) returns (AccessTokenResponse);
}

enum TentaiAuthProvider {
  TENTAI_AUTH_PROVIDER_UNSPECIFIED = 0;
  TENTAI_AUTH_PROVIDER_GOOGLE = 1;
  TENTAI_AUTH_PROVIDER_APPLE = 2;
  TENTAI_AUTH_PROVIDER_EMAIL = 3;
}

message AuthenticateTentaiUserRequest {
  string email = 1;
  TentaiAuthProvider provider = 2;
}

message TelegramMiniAppAuthRequest {
  string init_data = 1;
}

message TelegramLoginWidgetAuthRequest {
  string id = 1;
  string hash = 2;
  string username = 3;
  string first_name = 4;
  string last_name = 5;
  string auth_date = 6;
  string photo_url = 7;
  string language_code = 8;
  bool allows_write_to_pm = 9;
}

message GoogleAuthRequest {
  string id_token = 1;
}

message GoogleAuthStartRequest {
  optional string return_url = 1;
}

message GoogleAuthStartResponse {
  string auth_url = 1;
}

message GoogleAuthCallbackRequest {
  string code = 1;
  string state = 2;
}

message ExchangeAuthCodeRequest {
  string code = 1;
}

message AuthExchangeCodeResponse {
  string exchange_code = 1;
  optional string return_url = 2;
}

message AppleAuthRequest {
  string identity_token = 1;
  optional string authorization_code = 2;
  optional string first_name = 3;
  optional string last_name = 4;
}

message ContactCodeRequest {
  string contact = 1;
  bool is_auth = 2;
}

message ContactVerifyRequest {
  string contact = 1;
  string code = 2;
  bool is_auth = 3;
}

message RefreshTokenRequest {
  string refresh_token = 1;
}

message AccessTokenRequest {
  string access_token = 1;
}

message AuthUserProfile {
  optional string first_name = 1;
  optional string last_name = 2;
}

message AuthTokensResponse {
  string access_token = 1;
  string refresh_token = 2;
  optional string return_url = 3;
  optional AuthUserProfile user = 4;
}

message AccessTokenResponse {
  string access_token = 1;
}

message MessageResponse {
  string message = 1;
}

message MeResponse {
  string sub = 1;
}