﻿CREATE PROCEDURE [dbo].[KST_UpdateKnok]
	@KnokId				BIGINT,
    @EntryPriceTouched	BIT = NULL, 
	@ExitPriceTouched	BIT = NULL, 
	@StopLossTouched	BIT = NULL, 
	@KnokStatusId		INT = NULL, 
	@HighRate			DECIMAL(22, 8) = NULL,
	@LowRate			DECIMAL(22, 8) = NULL,
	@KnokerWinRate		decimal(22, 8),
	@UserRefundRate		decimal(22, 8),
	@DistanceFromTarget decimal(22, 2) = NULL,
	@CloseRate			decimal(22, 8) = NULL
AS

DECLARE
		@TranStarted					bit,
		@RC								int,
		@ErrorMessage					nvarchar(1000),
		@TransId						bigint,
		
		@FollowersCount					int,
		@KnokPrice						decimal(22, 8),
		@KnokPublishPrice				decimal(22, 8),
		
		@UserId							bigint,
		@AccountId						bigint,
		@TransferAmount					decimal(22, 8),
		@PlatformUserId					bigint,
		@PlatformAccountId				bigint,
		@Comment						varchar(64)

BEGIN TRY 
	SET @RC = 0
	SET	@TranStarted = 0

	BEGIN TRANSACTION
	SET @TranStarted = 1
	IF ISNULL(@KnokStatusId, 0) = 5 --KNOK is resolved
	-- check for KnokerWinsToken
	BEGIN
		
		SELECT @KnokPrice = [Price],			
			@UserId = [CreatorUserId]
		FROM Signals WITH (NOLOCK) WHERE KnokId = @KnokId
		
		SELECT @KnokPublishPrice = [Amount], @AccountId = [AccountId]
		FROM [AccountTransactions] 
		WHERE 
			[AccountTransactionTypeId] = 4 --PublishKnok
			AND [KnokId] = @KnokId
			AND [UserId] = @UserId

		--user paid publish price so it is negative
		SET @KnokPublishPrice = - @KnokPublishPrice;

		SELECT @FollowersCount = COUNT([UserId]) FROM [UserKnoks] WHERE [KnokId] = @KnokId
		SET @TransferAmount = @FollowersCount * @KnokPrice * @KnokerWinRate + @KnokPublishPrice

		IF NOT @TransferAmount IS NULL 
		BEGIN
			SELECT @PlatformUserId = [UserId] FROM Users WHERE [UserTypeId] = 2 --Platform
			SET @PlatformAccountId = (SELECT TOP 1 [AccountId] FROM [Accounts] WHERE [UserId] = @PlatformUserId)

			SET @Comment = NEWID()

			--execute transaction
			EXEC	[dbo].[TRN_Account_TransferMoney]
			@FromUserId = @PlatformUserId,
			@FromAccountId = @PlatformAccountId,
			@FromExternalReferenceId = NULL,
			@FromWalletAddress = NULL,
		@FromAccountTransactionTypeId = 5, --KnokerWinsToken
			@ToUserId = @UserId,
			@ToAccountId = @AccountId,
			@ToExternalReferenceId = NULL,
			@ToWalletAddress = NULL,
		@ToAccountTransactionTypeId = 5, --KnokerWinsToken
			@Amount = @TransferAmount,
			@AmountUSD = NULL,
			@OperatorId = NULL,
			@Comment = @Comment,
			@PendingId = NULL,
			@KnokId = @KnokId
		END

		--Recalc DistanceFromTarget for User		
		SELECT @DistanceFromTarget = DistanceFromTarget FROM Signals WHERE KnokId = @KnokId AND ISNULL(@DistanceFromTarget, 0) = 0   
		IF ISNULL(@DistanceFromTarget, 0) <> 0 
		BEGIN
			UPDATE Users SET DistanceFromTarget =
				(SELECT ((SUM(ISNULL(DistanceFromTarget, 0))) + @DistanceFromTarget) / (COUNT(1) + 1)
				FROM Signals k
				WHERE KnokStatusId = 5 --Resolved 
					AND KnokId <> @KnokId AND CreatorUserId = UserId)
			WHERE UserId = @UserId;
		END

		--Recalc SuccessRate
		UPDATE Users SET SuccessRate =
			(SELECT
				ROUND((SELECT COUNT(1)
					FROM Signals sk
					WHERE sk.KnokStatusId = 5 --Resolved 
						AND sk.EntryPriceTouched = 1 AND sk.ExitPriceTouched = 1 AND sk.StopLossTouched = 0 AND sk.CreatorUserId = UserId) /				
				CAST(COUNT(1) AS DECIMAL(22,8)) * 100, 0)
				FROM Signals k
				WHERE k.CreatorUserId = UserId)
		WHERE UserId = @UserId

		--Recalc SuccessSequence
		if ISNULL(@EntryPriceTouched, 0) = 1 AND ISNULL(@ExitPriceTouched, 0) = 1 
		BEGIN
			UPDATE Users SET SuccessSequence = SuccessSequence+1 WHERE UserId = @UserId
		END

		if ISNULL(@StopLossTouched, 0) = 1 
		BEGIN
			UPDATE Users SET SuccessSequence = 0  WHERE UserId = @UserId
		END
	END --KNOK is resolved


	UPDATE Signals
	SET [EntryPriceTouched]		= ISNULL(@EntryPriceTouched, [EntryPriceTouched]),
		[ExitPriceTouched]		= ISNULL(@ExitPriceTouched, [ExitPriceTouched]),
		[StopLossTouched]		= ISNULL(@StopLossTouched, [StopLossTouched]),
		[KnokStatusId]			= ISNULL(@KnokStatusId, [KnokStatusId]),
		[HighRate]				= ISNULL(@HighRate, [HighRate]),
		[LowRate]				= ISNULL(@LowRate, [LowRate]),
		[CloseDate]				= IIF(ISNULL(@KnokStatusId, 0) = 5, GETUTCDATE(), [CloseDate]),
		[CloseRate]				= ISNULL(@CloseRate, [CloseRate]),
		[DistanceFromTarget]	= ISNULL(@DistanceFromTarget, [DistanceFromTarget]) 
	WHERE
		KnokId = @KnokId


	EXEC KST_GetKnoks @KnokId = @KnokId

	
	IF( @TranStarted = 1 )            
		COMMIT TRANSACTION            

	RETURN 0

END TRY           
BEGIN CATCH            
    IF( @TranStarted = 1 )            
		ROLLBACK TRANSACTION            

	EXEC [USP_LogError]           
	EXEC [USP_RethrowError]   
	
	IF @RC = 0 
		SET @RC = 1			         
	RETURN @RC
END CATCH