package model

// Gear vendor NPC types (town shop stock is restricted by slot set).
const (
	NPCTypeMerchant  = "merchant"  // feet, hands, cloak
	NPCTypeArmorer   = "armorer"   // legs, wrist, chest, head
	NPCTypeWeapon    = "weapon"    // main_hand
	NPCTypeJeweler   = "jeweler"   // finger, neck
	NPCTypeHealer    = "healer"
	NPCTypeBounty    = "bounty_hunter"
	NPCTypeElder     = "elder"
	NPCTypeQuestGiver = "quest_giver" // legacy; not used after DB migration
)

var gearVendorTypes = map[string]struct{}{
	NPCTypeMerchant: {},
	NPCTypeArmorer:  {},
	NPCTypeWeapon:   {},
	NPCTypeJeweler:  {},
}

// IsGearVendorType is true for town NPCs that sell rolled gear rows.
func IsGearVendorType(t string) bool {
	_, ok := gearVendorTypes[t]
	return ok
}

// GearVendorSlots returns allowed equipment slots for this vendor type, or nil if not a gear vendor.
func GearVendorSlots(npcType string) []EquipmentSlot {
	switch npcType {
	case NPCTypeMerchant:
		return []EquipmentSlot{SlotFeet, SlotHands, SlotCloak}
	case NPCTypeArmorer:
		return []EquipmentSlot{SlotLegs, SlotWrist, SlotChest, SlotHead}
	case NPCTypeWeapon:
		return []EquipmentSlot{SlotMainHand}
	case NPCTypeJeweler:
		return []EquipmentSlot{SlotFinger, SlotNeck}
	default:
		return nil
	}
}

// IsQuestOfferNPCType is true for NPCs that can offer quest templates from the catalog.
func IsQuestOfferNPCType(t string) bool {
	return t == NPCTypeBounty || t == NPCTypeElder || t == NPCTypeQuestGiver
}

// QuestTemplateAllowedForNPCType returns whether a quest template type may be offered by this NPC role.
func QuestTemplateAllowedForNPCType(npcType, questType string) bool {
	switch npcType {
	case NPCTypeBounty:
		return questType == "kill_count" || questType == "collect_item"
	case NPCTypeElder:
		return questType == "visit_town" || questType == "collect_item"
	case NPCTypeQuestGiver:
		return true
	default:
		return false
	}
}

// FilterQuestTemplatesByNPCType keeps only quests valid for the NPC role (no-op if not a quest NPC type).
func FilterQuestTemplatesByNPCType(quests []Quest, npcType string) []Quest {
	if !IsQuestOfferNPCType(npcType) || npcType == NPCTypeQuestGiver {
		return quests
	}
	out := make([]Quest, 0, len(quests))
	for _, q := range quests {
		if QuestTemplateAllowedForNPCType(npcType, q.Type) {
			out = append(out, q)
		}
	}
	return out
}
