#pragma once

#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "ZMMOJobTypes.h"
#include "ZMMOJobsSubsystem.generated.h"

class UZMMOJobDataAsset;

/**
 *  Cache central de UZMMOJobDataAsset por ClassId. Vive como GameInstance
 *  Subsystem — startup automatico quando GameInstance inicializa (PIE,
 *  standalone, packaged). Sobrevive a map transitions.
 *
 *  Initialize:
 *   1. Carrega via AssetRegistry: scan de UZMMOJobDataAsset em todo Content
 *   2. Cacheia em TMap<int32, UZMMOJobDataAsset*> por ClassId
 *   3. Log: quantos jobs encontrou
 *
 *  Uso:
 *   - C++:  GameInstance->GetSubsystem<UZMMOJobsSubsystem>()->GetJobData(0)
 *   - BP:   UZMMOJobsLibrary::GetJobData(WorldContext, 0)
 *
 *  Fase 7+ (Mod support): SCANEAR PrimaryAssetType="ZMMOJob" do AssetManager
 *  permite mods adicionarem DAs proprios sem mexer no source.
 */
UCLASS()
class ZMMOJOBS_API UZMMOJobsSubsystem : public UGameInstanceSubsystem
{
	GENERATED_BODY()

public:
	virtual void Initialize(FSubsystemCollectionBase& Collection) override;
	virtual void Deinitialize() override;

	/// Lookup por classId. Retorna nullptr se ClassId nao tem DA correspondente
	/// (caller usa Library com fallback FText).
	UFUNCTION(BlueprintPure, Category = "Zeus|Jobs")
	UZMMOJobDataAsset* GetJobData(int32 ClassId) const;

	/// Total de jobs cacheados (diagnostico).
	UFUNCTION(BlueprintPure, Category = "Zeus|Jobs")
	int32 GetJobCount() const { return CachedJobs.Num(); }

	/// Lista jobs num tier especifico (UI agrupa por tier — ex: dropdown
	/// "Vocacoes possiveis"). Ordem do retorno e' a do AssetRegistry scan
	/// — UI pode reordenar por ClassId/DisplayName se precisar.
	UFUNCTION(BlueprintPure, Category = "Zeus|Jobs")
	TArray<UZMMOJobDataAsset*> GetJobsByTier(EZMMOJobTier Tier) const;

	/// Destinos de promocao validos a partir do `CurrentClassId`. Filtra
	/// pelos jobs que tem `ParentClassId == CurrentClassId`. WBP de
	/// promocao consome direto pra montar botoes "Tornar-se X".
	///
	/// NOTA: condicao de elegibilidade real (jobLevel >= cap, quest, item)
	/// e' do server — UI apenas LISTA opcoes possiveis pelo schema. Server
	/// reponde rejeicao via S_JOB_CHANGE_RESULT (Jobs::EJobChangeRejectReason).
	UFUNCTION(BlueprintPure, Category = "Zeus|Jobs")
	TArray<UZMMOJobDataAsset*> GetEligibleNextJobs(int32 CurrentClassId) const;

private:
	/// Scan AssetRegistry + popula CachedJobs. Sincronizo (V1) — chamado UMA
	/// vez no Initialize. Pra 50 jobs eh aceitavel; se crescer pra 200+ pode
	/// virar async no futuro.
	void LoadJobsFromAssetRegistry();

	UPROPERTY()
	TMap<int32, TObjectPtr<UZMMOJobDataAsset>> CachedJobs;
};
