syntax = "proto3";

package activity;

option go_package = "github.com/echofi-ai/backend/types/activity";

import "activity/listening_history.proto";
import "activity/user_favorite.proto";
import "activity/playlist.proto";
import "activity/user_point_rate.proto";
import "activity/rate_param.proto";
import "activity/listening_session.proto";
import "activity/user_points.proto";

// ActivityService defines the gRPC service for activity operations
service ActivityService {
  // GetListeningHistory retrieves listening history by ID
  rpc GetListeningHistory(GetListeningHistoryRequest) returns (GetListeningHistoryResponse) {}

  // ListListeningHistory retrieves listening history with pagination
  rpc ListListeningHistory(ListListeningHistoryRequest) returns (ListListeningHistoryResponse) {}

  // GetUserFavorite retrieves a user favorite by ID
  rpc GetUserFavorite(GetUserFavoriteRequest) returns (GetUserFavoriteResponse) {}

  // ListUserFavorites retrieves user favorites with pagination
  rpc ListUserFavorites(ListUserFavoritesRequest) returns (ListUserFavoritesResponse) {}

  // GetPlaylist retrieves a playlist by ID
  rpc GetPlaylist(GetPlaylistRequest) returns (GetPlaylistResponse) {}

  // ListPlaylists retrieves playlists with pagination
  rpc ListPlaylists(ListPlaylistsRequest) returns (ListPlaylistsResponse) {}

  // ListPlaylistTracks retrieves tracks in a playlist with pagination
  rpc ListPlaylistTracks(ListPlaylistTracksRequest) returns (ListPlaylistTracksResponse) {}

  // GetUserPointRate retrieves a user point rate by user ID
  rpc GetUserPointRate(GetUserPointRateRequest) returns (GetUserPointRateResponse) {}

  // ListUserPointRates retrieves user point rates with pagination
  rpc ListUserPointRates(ListUserPointRatesRequest) returns (ListUserPointRatesResponse) {}

  // UpdateUserPointRate updates a user's point rate based on current referral count
  rpc UpdateUserPointRate(UpdateUserPointRateRequest) returns (UpdateUserPointRateResponse) {}

  // GetRateParam retrieves a rate parameter by ID
  rpc GetRateParam(GetRateParamRequest) returns (GetRateParamResponse) {}

  // ListRateParams retrieves rate parameters with pagination
  rpc ListRateParams(ListRateParamsRequest) returns (ListRateParamsResponse) {}

  // GetListeningSession retrieves a listening session by ID
  rpc GetListeningSession(GetListeningSessionRequest) returns (GetListeningSessionResponse) {}

  // ListListeningSessions retrieves listening sessions with pagination
  rpc ListListeningSessions(ListListeningSessionsRequest) returns (ListListeningSessionsResponse) {}

  // GetUserPoints retrieves user points by user ID
  rpc GetUserPoints(GetUserPointsRequest) returns (GetUserPointsResponse) {}

  // ListUserPoints retrieves user points with pagination
  rpc ListUserPoints(ListUserPointsRequest) returns (ListUserPointsResponse) {}

  // GetUnprocessedListeningRecords retrieves unprocessed listening sessions for authenticated user
  rpc GetUnprocessedListeningRecords(GetUnprocessedListeningRecordsRequest) returns (GetUnprocessedListeningRecordsResponse) {}

  // GetUnprocessedListeningDuration calculates total duration of unprocessed listening sessions for authenticated user
  rpc GetUnprocessedListeningDuration(GetUnprocessedListeningDurationRequest) returns (GetUnprocessedListeningDurationResponse) {}

}

// Listening History requests and responses
message GetListeningHistoryRequest {
  int32 history_id = 1;
}

message GetListeningHistoryResponse {
  ListeningHistory history = 1;
}

message ListListeningHistoryRequest {
  int32 offset = 1;
  int32 limit = 2;
  optional string user_id = 3; // Filter by user
  optional int32 track_id = 4; // Filter by track
}

message ListListeningHistoryResponse {
  repeated ListeningHistory histories = 1;
  int64 total = 2;
  int32 offset = 3;
  int32 limit = 4;
}

// User Favorites requests and responses
message GetUserFavoriteRequest {
  int32 favorite_id = 1;
}

message GetUserFavoriteResponse {
  UserFavorite favorite = 1;
}

message ListUserFavoritesRequest {
  int32 offset = 1;
  int32 limit = 2;
  optional string user_id = 3; // Filter by user
}

message ListUserFavoritesResponse {
  repeated UserFavorite favorites = 1;
  int64 total = 2;
  int32 offset = 3;
  int32 limit = 4;
}

// Playlist requests and responses
message GetPlaylistRequest {
  int32 playlist_id = 1;
}

message GetPlaylistResponse {
  Playlist playlist = 1;
}

message ListPlaylistsRequest {
  int32 offset = 1;
  int32 limit = 2;
  optional string created_by = 3; // Filter by creator
  optional bool is_public = 4;    // Filter by public status
}

message ListPlaylistsResponse {
  repeated Playlist playlists = 1;
  int64 total = 2;
  int32 offset = 3;
  int32 limit = 4;
}

// Playlist Tracks requests and responses
message ListPlaylistTracksRequest {
  int32 playlist_id = 1;
  int32 offset = 2;
  int32 limit = 3;
}

message ListPlaylistTracksResponse {
  repeated PlaylistTrack tracks = 1;
  int64 total = 2;
  int32 offset = 3;
  int32 limit = 4;
}

// User Point Rate requests and responses
message GetUserPointRateRequest {
  string user_id = 1;
}

message GetUserPointRateResponse {
  UserPointRate rate = 1;
}

message ListUserPointRatesRequest {
  int32 offset = 1;
  int32 limit = 2;
}

message ListUserPointRatesResponse {
  repeated UserPointRate rates = 1;
  int64 total = 2;
  int32 offset = 3;
  int32 limit = 4;
}

message UpdateUserPointRateRequest {
  string user_id = 1;
}

message UpdateUserPointRateResponse {
  UserPointRate rate = 1;
}

// Rate Parameter requests and responses
message GetRateParamRequest {
  int32 param_id = 1;
}

message GetRateParamResponse {
  RateParam param = 1;
}

message ListRateParamsRequest {
  int32 offset = 1;
  int32 limit = 2;
  optional bool is_active = 3; // Filter by active status
}

message ListRateParamsResponse {
  repeated RateParam params = 1;
  int64 total = 2;
  int32 offset = 3;
  int32 limit = 4;
}

// Listening Session requests and responses
message GetListeningSessionRequest {
  string id = 1;
}

message GetListeningSessionResponse {
  ListeningSession session = 1;
}

message ListListeningSessionsRequest {
  int32 offset = 1;
  int32 limit = 2;
  optional string user_id = 3; // Filter by user
  optional string status = 4;  // Filter by status
}

message ListListeningSessionsResponse {
  repeated ListeningSession sessions = 1;
  int64 total = 2;
  int32 offset = 3;
  int32 limit = 4;
}

// User Points requests and responses
message GetUserPointsRequest {
  string user_id = 1;
}

message GetUserPointsResponse {
  UserPoints points = 1;
}

message ListUserPointsRequest {
  int32 offset = 1;
  int32 limit = 2;
  optional string status = 3; // Filter by status
}

message ListUserPointsResponse {
  repeated UserPoints points = 1;
  int64 total = 2;
  int32 offset = 3;
  int32 limit = 4;
}

// Unprocessed Listening Records requests and responses
message GetUnprocessedListeningRecordsRequest {
  int32 offset = 1;
  int32 limit = 2;
}

message GetUnprocessedListeningRecordsResponse {
  repeated ListeningSession sessions = 1;
  int64 total = 2;
  int32 offset = 3;
  int32 limit = 4;
}

// Unprocessed Listening Duration requests and responses
message GetUnprocessedListeningDurationRequest {
  // No parameters needed - uses authenticated user ID from context
}

message GetUnprocessedListeningDurationResponse {
  // Total duration in seconds of all unprocessed listening sessions (excluding active sessions)
  int64 total_duration_seconds = 1;
  // Number of sessions included in the calculation
  int64 session_count = 2;
}
