/*
	Spawn Weapon actor to Right hand and assign it to ActiveRightHandWeapon,
	Then attach weapon to socket of current character.

	When ActiveRightHandWeapon is set, it is replicated back to all clients,
	and SetAttachWeapon is called again to attach weapon mesh.
*/
void UAREquipmentComponent::SetRightWeapon(FInventorySlot Weapon, class AARWeapon* PrevWeapon)
{
	if (PrevWeapon)
	{
		PrevWeapon->Destroy();
	}

	FString usless;
	FARItemData* data = WeaponItemDataTable->FindRow<FARItemData>(Weapon.ItemID, usless);

	if (data)
	{
		UBlueprint* gen = LoadObject<UBlueprint>(NULL, *data->ItemBlueprint.ToStringReference().ToString(), NULL, LOAD_None, NULL);
		if (!gen)
			return;

		AARCharacter* MyChar = Cast<AARCharacter>(GetOwner());
		//AARCharacter* MyChar = Cast<AARCharacter>(GetOuterAARPlayerController()->GetPawn());
		FActorSpawnParameters SpawnInfo;
		SpawnInfo.bNoCollisionFail = true;
		SpawnInfo.Owner = MyChar;
		AARWeapon* weaponBase = GetWorld()->SpawnActor<AARWeapon>(gen->GeneratedClass, SpawnInfo);
		
		weaponBase->ItemName = Weapon.ItemID;
		weaponBase->SetOwner(MyChar);
		weaponBase->Instigator = MyChar;
		weaponBase->WeaponOwner = MyChar;
		weaponBase->OwningController = TargetController;
		ActiveRightHandWeapon = weaponBase;
		OnRightWeaponActive.Broadcast(ActiveRightHandWeapon);
		SetAttachWeapon(ActiveRightHandWeapon, RightWeaponSocket);
	}
}
void UAREquipmentComponent::SetWeapon(FARDragDropInfo Weapon, class AARWeapon* PrevWeapon, int32 Hand)
{
	if (Hand == 0)
	{
		if (PrevWeapon)
		{
			AttachSheathhWeaponOnSwap(PrevWeapon, WeaponSockets, Hand);
			PrevWeapon->Destroy();
		}

		FARItemInfo* data = TestItems->GetItemDataFromArrayPtr(Weapon.ItemIndex);
		if (data)
		{
			AARCharacter* MyChar = Cast<AARCharacter>(GetOwner());
			//AARCharacter* MyChar = Cast<AARCharacter>(GetOuterAARPlayerController()->GetPawn());
			FActorSpawnParameters SpawnInfo;
			SpawnInfo.bNoCollisionFail = true;
			SpawnInfo.Owner = MyChar;
			AARWeapon* weaponBase;
			if (data->DefaultClass)
				weaponBase = GetWorld()->SpawnActor<AARWeapon>(data->DefaultClass, SpawnInfo);
			else
				weaponBase = GetWorld()->SpawnActor<AARWeapon>(AARWeapon::StaticClass(), SpawnInfo);
			
			weaponBase->ItemName = Weapon.ItemKey;
			weaponBase->ItemID = Weapon.ItemKey;
			weaponBase->ItemIndex = Weapon.ItemIndex;
			weaponBase->SetOwner(MyChar);
			weaponBase->Instigator = MyChar;
			weaponBase->WeaponOwner = MyChar;
			weaponBase->WeaponHand = EWeaponHand::WeaponLeft;

			weaponBase->ItemInfo = data->ItemInfo;

			ActiveLeftHandWeapon = weaponBase;
			//ActiveLeftHandWeapon->OnWeaponActive();
			//OnRightWeaponActive.Broadcast(ActiveLeftHandWeapon);
			ActiveLeftHandWeapon->Initialize();
			OnLeftWeaponActive.Broadcast(ActiveLeftHandWeapon);
			MulticastDetachWeaponSlotSwap(Weapon.ItemKey, Hand);
			SetAttachWeapon(ActiveLeftHandWeapon, LeftWeaponSocket);
		}
	}
	else if (Hand == 1)
	{
		if (PrevWeapon)
		{
			PrevWeapon->Destroy();
		}

		FARItemInfo* data = TestItems->GetItemDataFromArrayPtr(Weapon.ItemIndex);
		if (data)
		{
			AARCharacter* MyChar = Cast<AARCharacter>(GetOwner());
			//AARCharacter* MyChar = Cast<AARCharacter>(GetOuterAARPlayerController()->GetPawn());
			FActorSpawnParameters SpawnInfo;
			SpawnInfo.bNoCollisionFail = true;
			SpawnInfo.Owner = MyChar;

			AARWeapon* weaponBase;
			if (data->DefaultClass)
				weaponBase = GetWorld()->SpawnActor<AARWeapon>(data->DefaultClass, SpawnInfo);
			else
				weaponBase = GetWorld()->SpawnActor<AARWeapon>(AARWeapon::StaticClass(), SpawnInfo);

			weaponBase->ItemName = Weapon.ItemKey;
			weaponBase->ItemID = Weapon.ItemKey;
			weaponBase->ItemIndex = Weapon.ItemIndex;
			weaponBase->SetOwner(MyChar);
			weaponBase->Instigator = MyChar;
			weaponBase->WeaponOwner = MyChar;
			//weaponBase->OwningController = TargetController;
			weaponBase->WeaponHand = EWeaponHand::WeaponRight;

			weaponBase->ItemInfo = data->ItemInfo;

			ActiveRightHandWeapon = weaponBase;
			ActiveRightHandWeapon->Initialize();
			OnRightWeaponActive.Broadcast(ActiveRightHandWeapon);
			//ActiveLeftHandWeapon->OnWeaponActive();
			//OnRightWeaponActive.Broadcast(ActiveRightHandWeapon);
			MulticastDetachWeaponSlotSwap(Weapon.ItemKey, Hand);
			SetAttachWeapon(ActiveRightHandWeapon, RightWeaponSocket);
		}
	}

}
void UAREquipmentComponent::OnRep_ActiveRightHandWeapon()
{
	//DetachSheathedWeapon(ActiveRightHandWeapon);
	SetAttachWeapon(ActiveRightHandWeapon, RightWeaponSocket);
}
void UAREquipmentComponent::OnRep_ActiveRightHandWeapon()
{
	SetAttachWeapon(ActiveRightHandWeapon, RightWeaponSocket);
}
void UAREquipmentComponent::OnRep_AtiveLeftHandWeapon()
{
	SetAttachWeapon(ActiveLeftHandWeapon, LeftWeaponSocket);
}