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

#pragma once

#include "CoreMinimal.h"
#include "BodyPart.h"
#include "ClothingSlotType.h"
#include "Engine/DataAsset.h"
#include "NakedDesire/Items/ItemDefinition.h"
#include "NakedDesire/Progression/ProgressionPath.h"
#include "ClothingItemDefinition.generated.h"

USTRUCT(BlueprintType)
struct NAKEDDESIRE_API FBodyPartCoverage
{
	GENERATED_BODY()
	
	UPROPERTY(EditDefaultsOnly)
	float Coverage = 1.0f;
	
	UPROPERTY(EditDefaultsOnly)
	EBodyPart BodyPart = EBodyPart::Ass;
};

UENUM(BlueprintType)
enum class ERestrictionType : uint8
{
	BlockRun = 0,
	BlockCrouch = 1,
	BlockPhoneUsage = 2,
	BlockItemPickup = 3,
	BlockMasturbate = 4,
	BlockBoobsExpose = 5,
	BlockVaginaExpose = 6,
	BlockAnalExpose = 7,
	BlockSlotChange = 8,
};

USTRUCT(BlueprintType)
struct NAKEDDESIRE_API FClothingRestriction
{
	GENERATED_BODY()
	
	UPROPERTY()
	ERestrictionType RestrictionType = ERestrictionType::BlockRun;
	
	UPROPERTY()
	EClothingSlotType AffectedSlot = EClothingSlotType::Anal;
};

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 UClothingItemDefinition : public UItemDefinition
{
	GENERATED_BODY()

public:
	virtual TSubclassOf<UItemInstance> GetInstanceClass() const override;

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	EClothingSlotType SlotType;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	USkeletalMesh* SkeletalMesh;

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

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TArray<FBodyPartCoverage> CoveredBodyParts;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (EditCondition = "SlotType == EClothingSlotType::Footwear", 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)
	TArray<FGarmentContainerSlot> ContainerSlots;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TArray<FClothingRestriction> Restrictions;
	
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TArray<EBodyPart> HiddenBodyParts;
	
	UPROPERTY(EditDefaultsOnly,
		BlueprintReadOnly,
		meta = (EditCondition = "SlotType == EClothingSlotType::UnderwearTop || SlotType == EClothingSlotType::Top || SlotType == EClothingSlotType::Bodysuit",
			ClampMin = 0.0f, ClampMax = 1.0f,
			UIMin = 0.0f, UIMax = 1.0f))
	float BoobsSupport = 0.0f;
};
