// © 2025 Naked People Team. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "BodyPart.h"
#include "ClothingSlotType.h"
#include "Engine/DataAsset.h"
#include "NakedDesire/Player/PrivateBodyPartType.h"
#include "NakedDesire/Progression/ProgressionPath.h"
#include "ClothingItem.generated.h"

UENUM(BlueprintType)
enum class EGarmentContainerSlotType : uint8
{
	S UMETA(DisplayName = "Small"),
	M UMETA(DisplayName = "Medium"),
	L UMETA(DisplayName = "Large"),
};

USTRUCT(BlueprintType)
struct NAKEDDESIRE_API FGarmentContainerSlot
{
	GENERATED_BODY()

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	EGarmentContainerSlotType SlotType = EGarmentContainerSlotType::S;

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (ClampMin = 1))
	int32 Count = 1;
};

UCLASS(BlueprintType)
class NAKEDDESIRE_API UClothingItem : public UPrimaryDataAsset
{
	GENERATED_BODY()

public:
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	FText Name;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	UTexture2D* Icon;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	EClothingSlotType SlotType;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	USkeletalMesh* SkeletalMesh;

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TMap<FName, UMaterialInstance*> Materials;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	UStaticMesh* StaticMesh;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	int BasePrice;

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TArray<EPrivateBodyPartType> CoveredBodyParts; // TODO: Add coverage per body part
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (EditCondition = "SlotType == EClothingSlotType::Shoes", Category = "Shoes"))
	float ShoesOffset = 0.0f;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	bool UseLeaderPose = false;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	EProgressionPath ProgressionPath;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TArray<EBodyPart> CanExpose;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	bool IsRestrictive;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	float Coverage = 1.0f;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	bool IsUnderwear;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TArray<FGarmentContainerSlot> ContainerSlots;
};
