#pragma once

#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "ZMMOJobTypes.h"
#include "ZMMOJobDataAsset.generated.h"

class UTexture2D;
class USoundBase;
class UAnimInstance;
class UAnimMontage;

/**
 *  Dados visuais/UI de UM job (classe). 1 .uasset por job em
 *  `Content/ZMMO/Data/Jobs/DA_Job_<Nome>.uasset`.
 *
 *  ClassId eh a CHAVE — bate com `classId` do snapshot do server (rathena
 *  pc.hpp `job_class`, ex: Novice=0, Swordsman=1, Mage=2, ...).
 *
 *  Soft pointers (TSoftObjectPtr) sao usados pra assets pesados (textures,
 *  sounds) — lazy-loaded quando precisar (level up, hover icon). DataAsset
 *  em si fica em memoria depois do scan do Subsystem.
 *
 *  Async pointers (TSubclassOf) sao sync — anim BP precisa estar carregada
 *  quando o player spawna.
 */
UCLASS(BlueprintType)
class ZMMOJOBS_API UZMMOJobDataAsset : public UPrimaryDataAsset
{
	GENERATED_BODY()

public:
	/// Chave estavel (bate com `Config/Jobs/<Name>.json:Id` no server e com
	/// `FZMMOAttributesSnapshot::ClassId` recebido do server).
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job")
	int32 ClassId = 0;

	/// Nome tecnico estavel (en-US). Ex: "Novice", "Swordsman". Aparece em
	/// logs e telemetria — NUNCA exibido pro player.
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job")
	FString TechnicalName;

	/// Nome localizado exibido na UI (pt-BR no projeto base). Ex: "Novato".
	/// Pode usar FText Localization tables pra multi-idioma futuro.
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job")
	FText DisplayName;

	/// Tier hierarquico — espelha `JobDef::tier` do server. UI usa pra agrupar
	/// jobs (ex: lista de Vocacoes possiveis quando promovendo Novato).
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job")
	EZMMOJobTier Tier = EZMMOJobTier::Beginner;

	/// ClassId do parent na arvore de promocao. 0 = sem parent (Novato eh root).
	/// Espelha `JobDef::parentJobId` do server. UI usa pra filtrar destinos
	/// possiveis ao mostrar painel de promocao.
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job")
	int32 ParentClassId = 0;

	/// Lista de armas que o job pode equipar. Espelha `JobDef::allowedWeaponsMask`
	/// do server (mas como TArray pra editor visual em vez de bitmask cru).
	/// Inventory UI usa pra hint "nao pode equipar" + filtro de catalogo.
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job")
	TArray<EZMMOWeaponType> AllowedWeapons;

	/// Icone do job — usado em StatusWindow, CharacterCard, JobChangeUI.
	/// Soft ptr: nao carrega ate alguem chamar LoadSynchronous() ou async load.
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job|Assets")
	TSoftObjectPtr<UTexture2D> JobIcon;

	/// AnimInstance class override (opcional). Quando nao-null, AnimBP
	/// padrao do PlayerCharacter eh substituido por esta classe no spawn
	/// (jobs com move set diferente — Monge bate, Assassin furtivo, etc.).
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job|Anim")
	TSubclassOf<UAnimInstance> DefaultAnimInstanceClass;

	/// Montage de "job change" (animacao de transformacao). Tocada quando
	/// player promove de Novice → 1a classe. V1 nao implementado.
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job|Anim")
	TSoftObjectPtr<UAnimMontage> JobChangeMontage;

	/// Som de level up override. Quando null, HUD usa som generico do projeto.
	/// Soft ptr: lazy load no primeiro level up.
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Zeus|Job|Audio")
	TSoftObjectPtr<USoundBase> LevelUpSoundCue;

	/// PrimaryAssetType pro AssetManager (precisa pra GetPrimaryAssetIdList).
	/// Hardcoded "ZMMOJob" — registry classifica todos os DAs deste tipo.
	virtual FPrimaryAssetId GetPrimaryAssetId() const override
	{
		return FPrimaryAssetId(FPrimaryAssetType(TEXT("ZMMOJob")),
		                       *FString::Printf(TEXT("Job_%d_%s"), ClassId, *TechnicalName));
	}
};
