## WeaponData — A resource defining a weapon's static properties.
##
## Used as the data contract between weapon_definitions.gd, weapon_server.gd,
## and weapon_manager.gd. Each weapon type is pre-configured and accessible
## via the class-level constants (RIFLE, PISTOL, SHOTGUN, SMG).
##
## Usage:
##   var data: WeaponData = WeaponData.RIFLE
##   print(data.display_name)  # "Assault Rifle"
##
extends Resource
class_name WeaponData

# ---------------------------------------------------------------------------
# Properties
# ---------------------------------------------------------------------------

## Unique identifier string (e.g., "rifle", "pistol").
@export var weapon_id: String = ""

## Human-readable weapon name.
@export var display_name: String = ""

## Base damage per projectile/pellet.
@export var damage: float = 0.0

## Rate of fire in rounds per second (Hz).
@export var fire_rate: float = 0.0

## Magazine capacity (max ammo per reload).
@export var mag_size: int = 0

## Reload duration in seconds.
@export var reload_time: float = 0.0

## If true, hold to fire continuously. If false, single-shot per press.
@export var is_automatic: bool = false

## Base weapon spread in degrees (used for accuracy cone).
@export var spread_degrees: float = 0.0

## Effective range in Godot units (metres conceptual).
@export var range: float = 0.0

## Number of pellets/projectiles per shot (1 for most weapons, 8 for shotgun).
@export var pellets_per_shot: int = 1

# ---------------------------------------------------------------------------
# Pre-configured weapon instances (class-level constants)
# ---------------------------------------------------------------------------

## Assault Rifle — 30 dmg, 10 rps, 30 mag, 2.1s reload, automatic, 0.5° spread, 200m range.
const RIFLE: Resource = pref(
    "rifle", "Assault Rifle",
    30.0, 10.0, 30, 2.1, true, 0.5, 200.0, 1
)

## Pistol — 25 dmg, 4 rps, 12 mag, 1.5s reload, semi-auto, 0.3° spread, 80m range.
const PISTOL: Resource = pref(
    "pistol", "Pistol",
    25.0, 4.0, 12, 1.5, false, 0.3, 80.0, 1
)

## Shotgun — 8 dmg × 8 pellets, 1 rps, 8 mag, 3.0s reload, semi-auto, 3° spread, 30m range.
const SHOTGUN: Resource = pref(
    "shotgun", "Shotgun",
    8.0, 1.0, 8, 3.0, false, 3.0, 30.0, 8
)

## SMG — 18 dmg, 12 rps, 25 mag, 1.8s reload, automatic, 1.5° spread, 100m range.
const SMG: Resource = pref(
    "smg", "Submachine Gun",
    18.0, 12.0, 25, 1.8, true, 1.5, 100.0, 1
)

# ---------------------------------------------------------------------------
# Factory helper
# ---------------------------------------------------------------------------

## Internal helper that constructs a WeaponData instance from raw values.
## This avoids repeating the constructor boilerplate for every constant.
static func pref(
    _weapon_id: String,
    _display_name: String,
    _damage: float,
    _fire_rate: float,
    _mag_size: int,
    _reload_time: float,
    _is_automatic: bool,
    _spread_degrees: float,
    _range: float,
    _pellets: int = 1
) -> WeaponData:
    var w := WeaponData.new()
    w.weapon_id = _weapon_id
    w.display_name = _display_name
    w.damage = _damage
    w.fire_rate = _fire_rate
    w.mag_size = _mag_size
    w.reload_time = _reload_time
    w.is_automatic = _is_automatic
    w.spread_degrees = _spread_degrees
    w.range = _range
    w.pellets_per_shot = _pellets
    return w
