syntax = "proto3";

package proto;

option csharp_namespace = "DysonNetwork.Shared.Proto";

option go_package = "git.solsynth.dev/goatworks/turbine/pkg/shared/proto/gen";

import "google/protobuf/timestamp.proto";
import "google/protobuf/wrappers.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/struct.proto";

import 'file.proto';
import 'wallet.proto';

// Account represents a user account in the system
message Account {
    string id = 1;
    string name = 2;
    string nick = 3;
    string language = 4;
    string region = 18;
    google.protobuf.Timestamp activated_at = 5;
    bool is_superuser = 6;

    AccountProfile profile = 7;
    optional SubscriptionReferenceObject perk_subscription = 16;
    repeated AccountContact contacts = 8;
    repeated AccountBadge badges = 9;
    repeated AccountAuthFactor auth_factors = 10;
    repeated AccountConnection connections = 11;
    repeated Relationship outgoing_relationships = 12;
    repeated Relationship incoming_relationships = 13;

    google.protobuf.Timestamp created_at = 14;
    google.protobuf.Timestamp updated_at = 15;

    google.protobuf.StringValue automated_id = 17;
}

// Enum for status attitude
enum StatusAttitude {
    STATUS_ATTITUDE_UNSPECIFIED = 0;
    POSITIVE = 1;
    NEGATIVE = 2;
    NEUTRAL = 3;
}

// AccountStatus represents the status of an account
message AccountStatus {
    string id = 1;
    StatusAttitude attitude = 2;
    bool is_online = 3;
    bool is_customized = 4;
    bool is_invisible = 5;
    bool is_not_disturb = 6;
    google.protobuf.StringValue label = 7;
    google.protobuf.Timestamp cleared_at = 8;
    string account_id = 9;
    bytes meta = 10;
}

message UsernameColor {
    string type = 1;
    google.protobuf.StringValue value = 2;
    google.protobuf.StringValue direction = 3;
    repeated string colors = 4;
}

message ProfileLink {
    string name = 1;
    string url = 2;
}

// Profile contains detailed information about a user
message AccountProfile {
    string id = 1;
    google.protobuf.StringValue first_name = 2;
    google.protobuf.StringValue middle_name = 3;
    google.protobuf.StringValue last_name = 4;
    google.protobuf.StringValue bio = 5;
    google.protobuf.StringValue gender = 6;
    google.protobuf.StringValue pronouns = 7;
    google.protobuf.StringValue time_zone = 8;
    google.protobuf.StringValue location = 9;
    google.protobuf.Timestamp birthday = 10;
    google.protobuf.Timestamp last_seen_at = 11;

    VerificationMark verification = 12;
    BadgeReferenceObject active_badge = 13;

    int32 experience = 14;
    int32 level = 15;
    double leveling_progress = 16;
    double social_credits = 17;
    int32 social_credits_level = 18;

    CloudFile picture = 19;
    CloudFile background = 20;

    string account_id = 21;

    google.protobuf.Timestamp created_at = 22;
    google.protobuf.Timestamp updated_at = 23;
    optional UsernameColor username_color = 24;
    repeated ProfileLink links = 25;
}

// AccountContact represents a contact method for an account
message AccountContact {
    string id = 1;
    AccountContactType type = 2;
    google.protobuf.Timestamp verified_at = 3;
    bool is_primary = 4;
    string content = 5;
    string account_id = 6;

    google.protobuf.Timestamp created_at = 7;
    google.protobuf.Timestamp updated_at = 8;
}

// Enum for contact types
enum AccountContactType {
    ACCOUNT_CONTACT_TYPE_UNSPECIFIED = 0;
    EMAIL = 1;
    PHONE_NUMBER = 2;
    ADDRESS = 3;
}

// AccountAuthFactor represents an authentication factor for an account
message AccountAuthFactor {
    string id = 1;
    AccountAuthFactorType type = 2;
    google.protobuf.StringValue secret = 3;  // Omitted from JSON serialization in original
    map<string, google.protobuf.Value> config = 4;  // Omitted from JSON serialization in original
    int32 trustworthy = 5;
    google.protobuf.Timestamp enabled_at = 6;
    google.protobuf.Timestamp expired_at = 7;
    string account_id = 8;
    map<string, google.protobuf.Value> created_response = 9;  // For initial setup

    google.protobuf.Timestamp created_at = 10;
    google.protobuf.Timestamp updated_at = 11;
}

// Enum for authentication factor types
enum AccountAuthFactorType {
    AUTH_FACTOR_TYPE_UNSPECIFIED = 0;
    PASSWORD = 1;
    EMAIL_CODE = 2;
    IN_APP_CODE = 3;
    TIMED_CODE = 4;
    PIN_CODE = 5;
}

// AccountBadge represents a badge associated with an account
message AccountBadge {
    string id = 1;  // Unique identifier for the badge
    string type = 2;  // Type/category of the badge
    google.protobuf.StringValue label = 3;  // Display name of the badge
    google.protobuf.StringValue caption = 4;  // Optional description of the badge
    map<string, google.protobuf.Value> meta = 5;  // Additional metadata for the badge
    google.protobuf.Timestamp activated_at = 6;  // When the badge was activated
    google.protobuf.Timestamp expired_at = 7;  // Optional expiration time
    string account_id = 8;  // ID of the account this badge belongs to

    google.protobuf.Timestamp created_at = 9;
    google.protobuf.Timestamp updated_at = 10;
}

// AccountConnection represents a third-party connection for an account
message AccountConnection {
    string id = 1;
    string provider = 2;
    string provided_identifier = 3;
    map<string, google.protobuf.Value> meta = 4;
    google.protobuf.StringValue access_token = 5;  // Omitted from JSON serialization
    google.protobuf.StringValue refresh_token = 6;  // Omitted from JSON serialization
    google.protobuf.Timestamp last_used_at = 7;
    string account_id = 8;

    google.protobuf.Timestamp created_at = 9;
    google.protobuf.Timestamp updated_at = 10;
}

// VerificationMark represents verification status
message VerificationMark {
    VerificationMarkType type = 1;
    string title = 2;
    string description = 3;
    string verified_by = 4;

    google.protobuf.Timestamp created_at = 5;
    google.protobuf.Timestamp updated_at = 6;
}

enum VerificationMarkType {
    VERIFICATION_MARK_TYPE_UNSPECIFIED = 0;
    OFFICIAL = 1;
    INDIVIDUAL = 2;
    ORGANIZATION = 3;
    GOVERNMENT = 4;
    CREATOR = 5;
    DEVELOPER = 6;
    PARODY = 7;
}

// BadgeReferenceObject represents a reference to a badge with minimal information
message BadgeReferenceObject {
    string id = 1;  // Unique identifier for the badge
    string type = 2;  // Type/category of the badge
    google.protobuf.StringValue label = 3;  // Display name of the badge
    google.protobuf.StringValue caption = 4;  // Optional description of the badge
    map<string, google.protobuf.Value> meta = 5;  // Additional metadata for the badge
    google.protobuf.Timestamp activated_at = 6;  // When the badge was activated
    google.protobuf.Timestamp expired_at = 7;  // Optional expiration time
    string account_id = 8;  // ID of the account this badge belongs to
}

// Relationship represents a connection between two accounts
message Relationship {
    string account_id = 1;
    string related_id = 2;
    optional Account account = 3;
    optional Account related = 4;
    int32 status = 5;

    google.protobuf.Timestamp created_at = 6;
    google.protobuf.Timestamp updated_at = 7;
}

// Leveling information
message LevelingInfo {
    int32 current_level = 1;
    int32 current_experience = 2;
    int32 next_level_experience = 3;
    int32 previous_level_experience = 4;
    double level_progress = 5;
    repeated int32 experience_per_level = 6;
}

// ActionLog represents a record of an action taken by a user
message ActionLog {
    string id = 1; // Unique identifier for the log entry
    string action = 2; // The action that was performed, e.g., "user.login"
    map<string, google.protobuf.Value> meta = 3; // Metadata associated with the action
    google.protobuf.StringValue user_agent = 4; // User agent of the client
    google.protobuf.StringValue ip_address = 5; // IP address of the client
    google.protobuf.StringValue location = 6; // Geographic location of the client, derived from IP
    string account_id = 7; // The account that performed the action
    google.protobuf.StringValue session_id = 8; // The session in which the action was performed

    google.protobuf.Timestamp created_at = 9; // When the action log was created
}

message GetAccountStatusBatchResponse {
    repeated AccountStatus statuses = 1;
}

// ====================================
// Service Definitions
// ====================================

// AccountService provides CRUD operations for user accounts and related entities
service AccountService {
    // Account Operations
    rpc GetAccount(GetAccountRequest) returns (Account) {}
    rpc GetBotAccount(GetBotAccountRequest) returns (Account) {}
    rpc GetAccountBatch(GetAccountBatchRequest) returns (GetAccountBatchResponse) {}
    rpc GetBotAccountBatch(GetBotAccountBatchRequest) returns (GetAccountBatchResponse) {}
    rpc LookupAccountBatch(LookupAccountBatchRequest) returns (GetAccountBatchResponse) {}
    rpc SearchAccount(SearchAccountRequest) returns (GetAccountBatchResponse) {}
    rpc ListAccounts(ListAccountsRequest) returns (ListAccountsResponse) {}

    rpc GetAccountStatus(GetAccountRequest) returns (AccountStatus) {}
    rpc GetAccountStatusBatch(GetAccountBatchRequest) returns (GetAccountStatusBatchResponse) {}

    // Profile Operations
    rpc GetProfile(GetProfileRequest) returns (AccountProfile) {}

    // Contact Operations
    rpc ListContacts(ListContactsRequest) returns (ListContactsResponse) {}

    // Badge Operations
    rpc ListBadges(ListBadgesRequest) returns (ListBadgesResponse) {}

    // Authentication Factor Operations
    rpc ListAuthFactors(ListAuthFactorsRequest) returns (ListAuthFactorsResponse) {}

    // Connection Operations
    rpc ListConnections(ListConnectionsRequest) returns (ListConnectionsResponse) {}

    // Relationship Operations
    rpc ListRelationships(ListRelationshipsRequest) returns (ListRelationshipsResponse) {}

    rpc GetRelationship(GetRelationshipRequest) returns (GetRelationshipResponse) {}
    rpc HasRelationship(GetRelationshipRequest) returns (google.protobuf.BoolValue) {}
    rpc ListFriends(ListRelationshipSimpleRequest) returns (ListRelationshipSimpleResponse) {}
    rpc ListBlocked(ListRelationshipSimpleRequest) returns (ListRelationshipSimpleResponse) {}
}

// ActionLogService provides operations for action logs
service ActionLogService {
    rpc CreateActionLog(CreateActionLogRequest) returns (CreateActionLogResponse) {}
    rpc ListActionLogs(ListActionLogsRequest) returns (ListActionLogsResponse) {}
}

// ====================================
// Request/Response Messages
// ====================================

// ActionLog Requests/Responses
message CreateActionLogRequest {
    string action = 1;
    map<string, google.protobuf.Value> meta = 2;
    google.protobuf.StringValue user_agent = 3;
    google.protobuf.StringValue ip_address = 4;
    google.protobuf.StringValue location = 5;
    string account_id = 6;
    google.protobuf.StringValue session_id = 7;
}

message CreateActionLogResponse {
    ActionLog action_log = 1;
}

message ListActionLogsRequest {
    string account_id = 1;
    string action = 2;
    int32 page_size = 3;
    string page_token = 4;
    string order_by = 5;
}

message ListActionLogsResponse {
    repeated ActionLog action_logs = 1;
    string next_page_token = 2;
    int32 total_size = 3;
}

// Account Requests/Responses
message GetAccountRequest {
    string id = 1;  // Account ID to retrieve
}

message GetBotAccountRequest {
    string automated_id = 1;
}

message GetAccountBatchRequest {
    repeated string id = 1;  // Account ID to retrieve
}

message GetBotAccountBatchRequest {
    repeated string automated_id = 1;
}

message LookupAccountBatchRequest {
    repeated string names = 1;
}

message SearchAccountRequest {
    string query = 1;
}

message GetAccountBatchResponse {
    repeated Account accounts = 1;  // List of accounts
}

message CreateAccountRequest {
    string name = 1;  // Required: Unique username
    string nick = 2;  // Optional: Display name
    string language = 3;  // Default language
    bool is_superuser = 4;  // Admin flag
    AccountProfile profile = 5;  // Initial profile data
}

message UpdateAccountRequest {
    string id = 1;  // Account ID to update
    google.protobuf.StringValue name = 2;  // New username if changing
    google.protobuf.StringValue nick = 3;  // New display name
    google.protobuf.StringValue language = 4;  // New language
    google.protobuf.BoolValue is_superuser = 5;  // Admin status
}

message DeleteAccountRequest {
    string id = 1;  // Account ID to delete
    bool purge = 2;  // If true, permanently delete instead of soft delete
}

message ListAccountsRequest {
    int32 page_size = 1;  // Number of results per page
    string page_token = 2;  // Token for pagination
    string filter = 3;  // Filter expression
    string order_by = 4;  // Sort order
}

message ListAccountsResponse {
    repeated Account accounts = 1;  // List of accounts
    string next_page_token = 2;  // Token for next page
    int32 total_size = 3;  // Total number of accounts
}

// Profile Requests/Responses
message GetProfileRequest {
    string account_id = 1;  // Account ID to get profile for
}

message UpdateProfileRequest {
    string account_id = 1;  // Account ID to update profile for
    AccountProfile profile = 2;  // Profile data to update
    google.protobuf.FieldMask update_mask = 3;  // Fields to update
}

// Contact Requests/Responses
message AddContactRequest {
    string account_id = 1;  // Account to add contact to
    AccountContactType type = 2;  // Type of contact
    string content = 3;  // Contact content (email, phone, etc.)
    bool is_primary = 4;  // If this should be the primary contact
}

message ListContactsRequest {
    string account_id = 1;  // Account ID to list contacts for
    AccountContactType type = 2;  // Optional: filter by type
    bool verified_only = 3;  // Only return verified contacts
}

message ListContactsResponse {
    repeated AccountContact contacts = 1;  // List of contacts
}

message VerifyContactRequest {
    string id = 1;  // Contact ID to verify
    string account_id = 2;  // Account ID (for validation)
    string code = 3;  // Verification code
}

// Badge Requests/Responses
message ListBadgesRequest {
    string account_id = 1;  // Account to list badges for
    string type = 2;  // Optional: filter by type
    bool active_only = 3;  // Only return active (non-expired) badges
}

message ListBadgesResponse {
    repeated AccountBadge badges = 1;  // List of badges
}

message ListAuthFactorsRequest {
    string account_id = 1;  // Account to list factors for
    bool active_only = 2;  // Only return active (non-expired) factors
}

message ListAuthFactorsResponse {
    repeated AccountAuthFactor factors = 1;  // List of auth factors
}

message ListConnectionsRequest {
    string account_id = 1;  // Account to list connections for
    string provider = 2;  // Optional: filter by provider
}

message ListConnectionsResponse {
    repeated AccountConnection connections = 1;  // List of connections
}

// Relationship Requests/Responses
message ListRelationshipsRequest {
    string account_id = 1;  // Account to list relationships for
    optional int32 status = 2;  // Filter by status
    int32 page_size = 5;  // Number of results per page
    string page_token = 6;  // Token for pagination
}

message ListRelationshipsResponse {
    repeated Relationship relationships = 1;  // List of relationships
    string next_page_token = 2;  // Token for next page
    int32 total_size = 3;  // Total number of relationships
}

message GetRelationshipRequest {
    string account_id = 1;
    string related_id = 2;
    optional int32 status = 3;
}

message GetRelationshipResponse {
    optional Relationship relationship = 1;
}

message ListRelationshipSimpleRequest {
    string account_id = 1;
}

message ListRelationshipSimpleResponse {
    repeated string accounts_id = 1;
}
