﻿CREATE PROCEDURE [BO_GetPublicKnoks]
	@KnokId BIGINT = NULL,
	@UserId BIGINT,
	@SortOrderAsc BIT = 0,
    @SortField INT = 1,
    @KnoksersIFollow BIT = 0,
	@Favorites BIT = 0,
    @ContainsTA BIT = 0,
    @ContainsFA BIT = 0,
    @KnokPriceMax decimal(18, 10) = NULL,
    @KnokPriceMin decimal(18, 10) = NULL,
    @ExchangesIdsString NVARCHAR(1024) = NULL,
    @TradingPairsString NVARCHAR(1024) = NULL,
	@RatingsString NVARCHAR(1024) = NULL,
	@Gaining BIT = 0,
	@Losing BIT = 0,
	@Published BIT = 0,
	@KnokFeedExpirationHours INT = NULL,
	@KnokToUSDRate decimal(22,8) = 1
AS
	declare @ExchangesIds TABLE(id int NULL);
	declare @Ratings TABLE(id int NULL);
	declare @TradingPairs TABLE(code nvarchar(255) NULL);

	insert into @ExchangesIds(id) SELECT cast(value as int) 
		FROM STRING_SPLIT(@ExchangesIdsString, ';')

	insert into @Ratings(id) SELECT cast(value as int) 
		FROM STRING_SPLIT(@RatingsString, ';')

	insert into @TradingPairs(code) SELECT value 
		FROM STRING_SPLIT(@TradingPairsString, ';')

	SELECT k.KnokId, k.Currency1, k.Currency2, k.Currency, k.ExchangeId, k.UserId, 
		k.HasFundamental, k.HasTechnical, k.CreateDate, k.PublishedDate, k.MarketDisplayName, k.ExchangeName,
		k.PotentialProfitValue, k.PotentialProfit,  k.FinishTime, 
		k.Price, k.Price * @KnokToUSDRate AS DollarPrice, k.EntryPriceTouched,
	    k.HasAvatar, k.UserName, k.FirstName, k.LastName, k.[Rank], 
		k.UserFollowers, k.KnokserRank, k.Purchases, k.UserActiveKnoks,
		(CASE WHEN EXISTS( select 1 from UserFollows e where e.UserId = @UserId and e.FollowUserId = k.UserId) THEN CAST (1 AS BIT) ELSE CAST (0 AS BIT) END) IsFollowed,
		(SELECT CAST (1 AS BIT) FROM UserKnoks uk WHERE uk.UserId = @UserId AND uk.KnokId = k.KnokId) AS IsBought,
		(CASE WHEN NOT @KnokFeedExpirationHours IS NULL AND DATEDIFF(MINUTE, GETUTCDATE(), DATEADD(HOUR, @KnokFeedExpirationHours, k.CreateDate)) >  0 
			THEN DATEDIFF(MINUTE, GETUTCDATE(), DATEADD(HOUR, @KnokFeedExpirationHours, k.CreateDate)) ELSE 0 END) AS MinutesLeftOnFeed
	FROM [VW_PublicKnoks] k

	-- Made for testing. Should be replaced with the joins to the actual data
	-- LEFT JOIN (SELECT Signals.[dbo].[Signals] as Id, 40.0 as DollarPrice, 0.51 TokenPrice,
 	-- 	CAST(0 AS bit) EntryPriceTouched, 0.0 KnokserRatingPoints, 0 KnokserRating -- 123 as Purchases, 0 UserFollowers, 0 UserActiveKnoks
	-- FROM Signals) temp on temp.Id = k.[dbo].[Signals] 
	
	WHERE k.KnokId = ISNULL(@KnokId, k.KnokId) 
	--and k.CreatorUserId != @UserId
	--and status.IsPublished = 1
	--and k.SellFinishDate >= GETUTCDATE()
	AND (EXISTS(SELECT 1 FROM @ExchangesIds HAVING COUNT(1) = 0) OR EXISTS (SELECT 1 FROM @ExchangesIds e WHERE e.id = k.ExchangeId))
	AND (EXISTS(SELECT 1 FROM @TradingPairs HAVING COUNT(1) = 0) OR EXISTS (SELECT 1 FROM @TradingPairs e WHERE e.code = k.Currency2))
	AND ((@ContainsTA = 1 AND k.HasTechnical = 1) OR ISNULL(@ContainsTA, 0) = 0)
	-- -- AND ISNULL(@ContainsTA, k.HasTechnical) = k.HasTechnical
	AND (EXISTS(SELECT 1 FROM @Ratings HAVING COUNT(1) = 0) OR EXISTS (SELECT 1 FROM @Ratings t WHERE t.id  = k.KnokserRank))

	AND ((@ContainsFA = 1 AND k.HasFundamental = 1) OR ISNULL(@ContainsFA, 0) = 0)
	AND (ISNULL(@KnoksersIFollow,0) = 0 OR EXISTS( select 1 from UserFollows e where e.UserId = @UserId and e.FollowUserId = k.UserId))
	AND ISNULL(@KnokPriceMax, k.Price)>= k.Price AND ISNULL(@KnokPriceMin, k.Price)<= k.Price
	AND (ISNULL(@Favorites, 0) = 0 or exists(SELECT 1 FROM [dbo].[UserFavoriteKnoks] fav WHERE fav.KnokId = k.KnokId and fav.UserId = @UserId))
	-- AND u.UserId <> @UserId Customer should have posibility to determine own order
	ORDER BY
		CASE @SortOrderAsc WHEN 1 THEN
		CASE WHEN ISNULL(@SortField, 1) = 1 THEN
			CASE @SortField 
				WHEN NULL THEN k.SellFinishDate -- TimeLeft
				WHEN 1 THEN k.SellFinishDate -- TimeLeft
			END
		END
		END ASC,
	
		CASE @SortOrderAsc WHEN 0 THEN
		CASE WHEN ISNULL(@SortField, 1) = 1 THEN
			CASE @SortField 
				WHEN NULL THEN k.SellFinishDate -- TimeLeft
				WHEN 1 THEN k.SellFinishDate -- TimeLeft
			END
		END
		END DESC,
		CASE @SortOrderAsc WHEN 1 THEN
		CASE WHEN ISNULL(@SortField, 1) > 1 THEN
			CASE @SortField 
				WHEN 2 THEN k.Price  -- Price
				WHEN 3 THEN  k.UserKnoks -- TimeLeft
			END
		END
		END ASC,
	
		CASE @SortOrderAsc WHEN 0 THEN
		CASE WHEN ISNULL(@SortField, 1) > 1 THEN
			CASE @SortField 
				WHEN 2 THEN k.Price  -- Price
				WHEN 3 THEN  k.UserKnoks -- TimeLeft
			END
		END
		END DESC
RETURN 0