syntax = "proto3";

package devvit.dev_portal.waitlist;

import "devvit/dev_portal/admin/waitlist_admin.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/wrappers.proto";

option go_package = "github.snooguts.net/reddit/reddit-devplatform-monorepo/go-common/generated/protos/types/devvit/devportal/waitlist";

enum ProgrammingExperienceLevel {
  BEGINNER = 0;
  PROFICIENT = 1;
  EXPERT = 2;
}

message IsCurrentUserRegisteredResponse {
  bool is_registered = 1;
  // Original response returned here to future-proof
  // in case we want to allow the user to change their response
  WaitlistRegisterUserRequest response = 2;
  devvit.dev_portal.admin.WaitlistStatus waitlist_status = 3;
}

message WaitlistRegisterUserRequest {
  // Thing ID
  string user_id = 1;
  // Username
  string user_name = 2;
  // "What apps, bots, or experiences would you like to build?"
  string what_to_build = 3;
  // "What types of bots have you created?" (only available if above is true)
  google.protobuf.StringValue bots_built = 5;
  // "What languages can you work with, and how proficient are you with them?"
  map<string, ProgrammingExperienceLevel> programming_experience = 6;
  string apps_wanted = 7;
  // "What apps or customizations would you like to see in your subreddit(s)?"
  bool does_consent_to_email = 8;
}

message WaitlistRegisterUserResponse {
  bool success = 1;
  // Optional message, for errors, etc.
  google.protobuf.StringValue message = 2;
}

message GetCurrentUserStatusResponse {
  devvit.dev_portal.admin.WaitlistStatus waitlist_status = 1;
  int32 accepted_terms_version = 2;
  int32 current_terms_version = 3;
  bool has_verified_email = 4;
  bool does_consent_to_email = 5;
}

service Waitlist {
  rpc IsCurrentUserRegistered(google.protobuf.Empty) returns (IsCurrentUserRegisteredResponse);
  rpc RegisterUser(WaitlistRegisterUserRequest) returns (WaitlistRegisterUserResponse);
  rpc GetCurrentUserStatus(google.protobuf.Empty) returns (GetCurrentUserStatusResponse);
  rpc AcceptTermsAndConditions(google.protobuf.Empty) returns (google.protobuf.Empty);
  rpc EnsureDeveloperAccountExists(google.protobuf.Empty) returns (WaitlistRegisterUserResponse);
}
