syntax = "proto3";

package freeexile.npc;

import "quest.proto";

// Vai trò & Thân phận của NPC trong Hoang Vực Lưu Đày (Grimdark Savage Primal)
enum NpcRole {
  NPC_ROLE_UNSPECIFIED = 0;
  NPC_ROLE_OUTCAST_SCAVENGER = 1;     // Gian Thương Hắc Thị / Nhặt Xác (Trao đổi Barter Huyết Thạch, Cốt Đinh)
  NPC_ROLE_BONE_BLACKSMITH = 2;       // Thiết Tượng Huyết Đồ (Rèn Cốt Thiết, đúc U Minh Cốt Đinh)
  NPC_ROLE_BLOOD_SHAMAN = 3;          // Huyết Vu Bà Bà (Tế Cốt, khơi thông Huyết Cốt Ma Đồ, Thú Tính)
  NPC_ROLE_FERAL_TRACKER = 4;         // Thợ Săn Dã Ngoại (Trinh sát hoang dã, dò vết quái vật)
  NPC_ROLE_SAVAGE_HERMIT = 5;         // Kẻ Điên Bão Cát / Dị Biến Ẩn Sĩ (Kỳ ngộ ẩn dã thú, khát máu)
  NPC_ROLE_FERAL_SPIRIT = 6;          // Chiến Hồn Tế Cốt (Anh linh chiến bại, khảo nghiệm tàn sát)
  NPC_ROLE_WAR_CHIEF = 7;             // Đầu Lĩnh Doanh Trại (Quy tắc sinh tồn kẻ mạnh, chỉ huy phòng ngự)
}

// Các dịch vụ nghiệp vụ sinh tồn hoang dã NPC cung cấp
enum NpcServiceType {
  NPC_SERVICE_UNSPECIFIED = 0;
  NPC_SERVICE_DIALOGUE = 1;           // Đàm đạo sinh tồn / Phân nhánh bản năng
  NPC_SERVICE_QUEST_DISPATCH = 2;     // Giao khế ước săn mồi & Thu nạp tàn cốt
  NPC_SERVICE_SHOP_VAULT = 3;         // Mở Hắc Thị Hoang Vực (Barter Huyết Thạch, Cốt Đinh)
  NPC_SERVICE_CRAFTING_FORGE = 4;     // Rèn Cốt Thiết, khảm Cổ Cốt Ấn, đúc Tà Khí
  NPC_SERVICE_MERIDIAN_INSIGHT = 5;   // Khảo sát Huyết Cốt Ma Đồ & Thức Tỉnh Thú Tính
  NPC_SERVICE_MAP_TELEPORT_GUIDE = 6; // Dẫn đường Thần Hành Trận & Cảnh báo dị tượng bão máu
  NPC_SERVICE_SECRET_TRIAL = 7;       // Hiến tế huyết nhục mở lối Mật Thất Cổ Ma
}

// Lựa chọn phân nhánh trong hội thoại
message NpcDialogueChoicePayload {
  string choice_id = 1;
  string text = 2;
  uint32 required_level = 3;
  string required_quest_id = 4;
  string target_node_id = 5;
  NpcServiceType trigger_service = 6;
  string trigger_param = 7;           // ID khế ước săn mồi / ID mật thất
  bool is_terminal = 8;
}

// Node hội thoại đơn lẻ trong cây thoại
message NpcDialogueNodePayload {
  string node_id = 1;
  string speaker_title = 2;
  string content = 3;
  string voice_cue_id = 4;
  repeated NpcDialogueChoicePayload choices = 5;
  bool is_terminal = 6;
}

// Thông tin định danh NPC trên bản đồ
message NpcInfoPayload {
  string npc_id = 1;
  string name = 2;
  string title = 3;
  NpcRole role = 4;
  string zone_id = 5;
  float x = 6;
  float y = 7;
  float z = 8;
  float interaction_radius = 9;
  repeated NpcServiceType supported_services = 10;
  string default_dialogue_node_id = 11;
  uint32 required_level = 12;
  string current_dialogue_tree_id = 13;
  bool is_visible = 14;
}

// Yêu cầu tương tác khi người chơi tiếp cận NPC (Proximity Interaction)
message InteractNpcRequest {
  string player_id = 1;
  string npc_id = 2;
  string zone_id = 3;
  float player_x = 4;
  float player_y = 5;
  uint32 player_level = 6;
  uint64 client_timestamp_ms = 7;
}

// Phản hồi tương tác kèm Node hội thoại ngữ cảnh
message InteractNpcResponse {
  bool success = 1;
  string message = 2;
  NpcInfoPayload npc_info = 3;
  NpcDialogueNodePayload active_dialogue_node = 4;
  repeated freeexile.quest.QuestState relevant_quests = 5;
}

// Chọn một câu trả lời trong cây hội thoại
message SelectDialogueChoiceRequest {
  string player_id = 1;
  string npc_id = 2;
  string current_node_id = 3;
  string choice_id = 4;
  uint64 client_timestamp_ms = 5;
}

// Kết quả chuyển node thoại hoặc kích hoạt hành động
message SelectDialogueChoiceResponse {
  bool success = 1;
  string message = 2;
  NpcDialogueNodePayload next_node = 3;
  NpcServiceType triggered_service = 4;
  string triggered_payload_id = 5;
}
