syntax = "proto3";

package freeexile.meridian;

enum MeridianNodeTypeProto {
  NODE_TYPE_UNSPECIFIED = 0;
  NODE_TYPE_ORIGIN = 1;        // Khởi Nguyên
  NODE_TYPE_VESSEL = 2;        // Tiểu Huyệt Căn Bản (Minor Node)
  NODE_TYPE_MAJOR = 3;         // Trung Huyệt / Cực Huyệt (Notable Node)
  NODE_TYPE_KEYSTONE = 4;      // Nghịch Mệnh Đại Huyệt (Keystone)
  NODE_TYPE_JEWEL_SOCKET = 5;  // Linh Cốt Khảm Tọa (Jewel Socket)
}

message MeridianStatBonusProto {
  int32 hp = 1;
  int32 mp = 2;
  float dps = 3;
  float dps_mult = 4;
  float crit_rate = 5;
  float crit_dmg = 6;
  int32 armor = 7;
  float evasion = 8;
  float life_leech = 9;
  float armor_pen = 10;
  float attack_speed = 11;
  float resist = 12;
  float dmg_reduction = 13;
}

message JewelItemProto {
  string jewel_id = 1;
  string name = 2;
  string rarity = 3;
  string element = 4;
  string icon = 5;
  MeridianStatBonusProto stats = 6;
  string lore = 7;
  repeated string stat_display = 8;
}

message MeridianNodeProto {
  string node_id = 1;
  string name = 2;
  string meridian = 3;
  string title = 4;
  MeridianNodeTypeProto node_type = 5;
  string element = 6;
  string cluster = 7;
  float x = 8;
  float y = 9;
  string lore = 10;
  MeridianStatBonusProto stats = 11;
  repeated string stat_display = 12;
  repeated string connected_node_ids = 13;
}

message PlayerMeridianStateProto {
  string player_id = 1;
  uint32 available_points = 2;
  uint32 spent_points = 3;
  repeated string unlocked_node_ids = 4;
  map<string, JewelItemProto> socketed_jewels = 5; // socket_id -> jewel
  MeridianStatBonusProto aggregated_stats = 6;
  uint64 last_updated_at = 7;
}

message MeridianUnlockRequest {
  string player_id = 1;
  string node_id = 2;
  uint64 client_timestamp_ms = 3;
}

message MeridianUnlockResponse {
  bool success = 1;
  string node_id = 2;
  string message = 3;
  uint32 available_points = 4;
  repeated string unlocked_node_ids = 5;
  MeridianStatBonusProto aggregated_stats = 6;
}

message MeridianSocketRequest {
  string player_id = 1;
  string socket_id = 2;
  string jewel_id = 3;
  uint64 client_timestamp_ms = 4;
}

message MeridianSocketResponse {
  bool success = 1;
  string socket_id = 2;
  string jewel_id = 3;
  string message = 4;
  MeridianStatBonusProto aggregated_stats = 5;
}

message MeridianUnsocketRequest {
  string player_id = 1;
  string socket_id = 2;
  uint64 client_timestamp_ms = 3;
}

message MeridianUnsocketResponse {
  bool success = 1;
  string socket_id = 2;
  string removed_jewel_id = 3;
  string message = 4;
  MeridianStatBonusProto aggregated_stats = 5;
}

message MeridianResetRequest {
  string player_id = 1;
  uint64 client_timestamp_ms = 2;
}

message MeridianResetResponse {
  bool success = 1;
  uint32 refunded_points = 2;
  uint32 available_points = 3;
  string message = 4;
}
