extends Node

@onready var inventory_system: Node = get_node("../InventorySystem")

var recipes: Array = []

func _ready() -> void:
  recipes = [
    {"id": &"wood", "name": "Wood", "out_count": 1, "inputs": {&"essence": 1}},
    {"id": &"stone", "name": "Stone", "out_count": 1, "inputs": {&"essence": 2}},
    {"id": &"iron", "name": "Iron", "out_count": 1, "inputs": {&"essence": 5}},
    {"id": &"sword", "name": "Sword", "out_count": 1, "inputs": {&"iron": 3, &"wood": 1}},
  ]

func get_recipes() -> Array:
  return recipes

func can_craft(player: Node, recipe: Dictionary) -> bool:
  for input_id in recipe.inputs.keys():
    if inventory_system.get_amount(player, input_id) < recipe.inputs[input_id]:
      return false
  return true

func craft(player: Node, recipe_id: StringName) -> bool:
  if not (multiplayer.is_server() or multiplayer.multiplayer_peer == null):
    request_craft.rpc_id(1, player.get_path(), recipe_id)
    return false
  var recipe: Dictionary = _find_recipe(recipe_id)
  if recipe.is_empty():
    return false
  if not can_craft(player, recipe):
    return false
  for input_id in recipe.inputs.keys():
    inventory_system.remove_item(player, input_id, recipe.inputs[input_id])
  inventory_system.add_item(player, recipe.id, recipe.out_count)
  EventBus.item_crafted.emit(player, recipe.id)
  return true

@rpc("any_peer", "reliable")
func request_craft(path: NodePath, recipe_id: StringName) -> void:
  var player: Node = get_node_or_null(path)
  if player:
    craft(player, recipe_id)

func _find_recipe(id: StringName) -> Dictionary:
  for r in recipes:
    if r.id == id:
      return r
  return {}
