syntax = "proto3";

package freeexile.quest;

enum QuestType {
  QUEST_TYPE_UNSPECIFIED = 0;
  QUEST_TYPE_NORMAL = 1;      // Nhiệm vụ thông thường (Chính tuyến & Phụ tuyến)
  QUEST_TYPE_HIDDEN = 2;      // Nhiệm vụ ẩn (Kích hoạt qua cơ duyên & tương tác bí mật)
  QUEST_TYPE_HIGH_TIER = 3;   // Nhiệm vụ cấp cao (Bí Cảnh, Hoàng Kim Boss, Đại Trận Pháp)
}

enum QuestStatus {
  QUEST_STATUS_UNSPECIFIED = 0;
  QUEST_STATUS_LOCKED = 1;
  QUEST_STATUS_AVAILABLE = 2;
  QUEST_STATUS_IN_PROGRESS = 3;
  QUEST_STATUS_COMPLETED = 4;
  QUEST_STATUS_CLAIMED = 5;
  QUEST_STATUS_FAILED = 6;
}

enum ObjectiveType {
  OBJ_TYPE_UNSPECIFIED = 0;
  OBJ_TYPE_KILL_MONSTER = 1;
  OBJ_TYPE_COLLECT_ITEM = 2;
  OBJ_TYPE_CRAFT_ITEM = 3;
  OBJ_TYPE_DISCOVER_LOCATION = 4;
  OBJ_TYPE_ACTIVATE_MERIDIAN = 5;
  OBJ_TYPE_PERFORM_ACTION = 6;
  OBJ_TYPE_TALK_NPC = 7;
  OBJ_TYPE_DELIVER_TO_NPC = 8;
}

message QuestRewardItem {
  string item_id = 1;
  string name = 2;
  uint32 quantity = 3;
}

message QuestRewardPayload {
  uint64 exp = 1;
  repeated QuestRewardItem spirit_stones = 2;
  uint32 meridian_points = 3;
  string granted_title = 4;
}

message QuestObjective {
  string objective_id = 1;
  string description = 2;
  ObjectiveType obj_type = 3;
  string target_id = 4;
  uint32 target_count = 5;
  uint32 current_count = 6;
  bool is_completed = 7;
}

message QuestState {
  string quest_id = 1;
  string title = 2;
  string description = 3;
  QuestType quest_type = 4;
  QuestStatus status = 5;
  uint32 required_level = 6;
  repeated QuestObjective objectives = 7;
  QuestRewardPayload reward = 8;
}

message AcceptQuestRequest {
  string player_id = 1;
  string quest_id = 2;
  uint64 client_timestamp_ms = 3;
}

message AcceptQuestResponse {
  bool success = 1;
  string message = 2;
  QuestState quest = 3;
}

message ClaimQuestRewardRequest {
  string player_id = 1;
  string quest_id = 2;
  uint64 client_timestamp_ms = 3;
}

message ClaimQuestRewardResponse {
  bool success = 1;
  string message = 2;
  QuestRewardPayload reward = 3;
}

message MilestoneTierInfo {
  string milestone_id = 1;
  string title = 2;
  string description = 3;
  uint32 required_total_completed = 4;
  uint32 required_hidden_completed = 5;
  uint32 required_high_tier_completed = 6;
  QuestRewardPayload reward = 7;
  bool is_claimed = 8;
  bool is_eligible = 9;
}

message ClaimMilestoneRewardRequest {
  string player_id = 1;
  string milestone_id = 2;
  uint64 client_timestamp_ms = 3;
}

message ClaimMilestoneRewardResponse {
  bool success = 1;
  string message = 2;
  QuestRewardPayload reward = 3;
}

message QuestProgressSyncNotice {
  string player_id = 1;
  repeated QuestState active_quests = 2;
  repeated MilestoneTierInfo milestones = 3;
  uint64 sync_timestamp_ms = 4;
}
