syntax = "proto3";

package proto;

option csharp_namespace = "DysonNetwork.Shared.Proto";

import "google/protobuf/timestamp.proto";

// ====================================
// Message Definitions
// ====================================

// SocialCreditRecord represents a record of social credit changes for an account
message SocialCreditRecord {
    string id = 1; // UUID string
    string reason_type = 2;
    string reason = 3;
    double delta = 4;
    string account_id = 5; // UUID string
    google.protobuf.Timestamp created_at = 6;
    google.protobuf.Timestamp updated_at = 7;
}

// ExperienceRecord represents a record of experience points gained by an account
message ExperienceRecord {
    string id = 1; // UUID string
    string reason_type = 2;
    string reason = 3;
    int64 delta = 4;
    double bonus_multiplier = 5;
    string account_id = 6; // UUID string
    google.protobuf.Timestamp created_at = 7;
    google.protobuf.Timestamp updated_at = 8;
}

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

// Social Credit Requests/Responses
message AddSocialCreditRecordRequest {
    string reason_type = 1;
    string reason = 2;
    double delta = 3;
    string account_id = 4; // UUID string
    google.protobuf.Timestamp expired_at = 5;
}

message GetSocialCreditRequest {
    string account_id = 1; // UUID string
}

message SocialCreditResponse {
    double amount = 1;
}

// Experience Requests/Responses
message AddExperienceRecordRequest {
    string reason_type = 1;
    string reason = 2;
    int64 delta = 3;
    string account_id = 4; // UUID string
}

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

// SocialCreditService provides operations for managing social credit scores
service SocialCreditService {
    // Adds a new social credit record for an account
    rpc AddRecord(AddSocialCreditRecordRequest) returns (SocialCreditRecord);

    // Gets the current social credit score for an account
    rpc GetSocialCredit(GetSocialCreditRequest) returns (SocialCreditResponse);
}

// ExperienceService provides operations for managing experience points
service ExperienceService {
    // Adds a new experience record for an account
    rpc AddRecord(AddExperienceRecordRequest) returns (ExperienceRecord);
}
