 
-- =============================================
-- Author:		Matthew Schill
-- Create date: 03/20/2026
-- Description:	Script to consolidate Cover Pages for Barakah
--  by Converting multi-unit procedures with Cover Pages
--  to use 1 Library Document Cover Page
-- =============================================

 ----@isTest = 0 will change data
 ----@isTest = 1 for internal testing (no data will be changed)
DECLARE  @isTest bit = 1;

 ----Per Cover Page, pull how many cover pages
 ----Each Cover Page's procedure has
 ----and how many of those are library documents
 select Contents.ContentID
 	  , Contenttext = Contents.Text
	  , Items.ItemID
 	  , tblDocuments.DocID
 	  , ParentContentID
 	  , ParentItemID
 	  , LibTitle = ISNULL(LibTitle,'')
 	  , numLibCP
 	  , numCP
 	  ,BaseFlag = 0
 INTO #tmpUpdate
 from Contents 
 inner join Entries on Contents.ContentID = Entries.ContentID
 inner join tblDocuments on tblDocuments.DocID = Entries.DocID
 inner join Items on Items.ContentID = Contents.ContentID
 outer apply
 (select ParentContentID=ContentID, ParentItemID = PItm.ItemID
  FROM dbo.vefn_ParentItems(Items.ItemID) PItm
  where PItm.ItemID <> Items.ItemID
 ) parent
 outer apply
 (select numLibCP = Count(*)
  FROM dbo.vefn_ChildItems(ParentItemID) PItm
  INNER JOIN Contents on Contents.ContentID = PItm.ContentID
  INNER JOIN Entries on Contents.ContentID = Entries.ContentID
  INNER JOIN tblDocuments on tblDocuments.DocID = Entries.DocID
  where PItm.ItemID <> ParentItemID
  AND Contents.text like 'Cover Page%' and ISNULL(tblDocuments.LibTitle,'') <> ''
 ) childWithLibTitle
 outer apply
 (select numCP = Count(*)
  FROM dbo.vefn_ChildItems(ParentItemID) PItm
  INNER JOIN Contents on Contents.ContentID = PItm.ContentID
  where PItm.ItemID <> ParentItemID
  AND Contents.text like 'Cover Page%'
 ) child
 where Contents.text like 'Cover Page%'
 order by ParentContentID asc, CASE WHEN ISNULL(LibTitle,'') <> '' THEN 1 ELSE 2 END asc, Contents.Text asc

--BaseFlag
-- 0 = a Cover Page that will be deleted
-- 1 = is base item (Cover Page will get renamed and applicability set to all)
-- 2 = would be base item but not linked to Lib document (Cover Page will get renamed and applicability set to all + will need linked to library doc)

---- If only 1 Library Doc CP for the CP's procedure and this is it, then mark this CP as the one we will keep
 UPDATE #tmpUpdate SET BaseFlag = 1 where LibTitle <> '' and numLibCP = 1

---- If multiple Library Document CPs, pick the first one as the one we will keep (BaseFlag = 1)
---- If no Library Document CPs, pick the first one as the one we will repurpose (BaseFlag = 2)
 UPDATE #tmpUpdate SET BaseFlag = CASE WHEN tU.LibTitle <> '' THEN 1 ELSE 2 END FROM #tmpUpdate tU
 where BaseFlag = 0 AND tU.ContentID IN
 (
 Select ContentID FROM
 (SELECT sub.ContentID,
        row_number() OVER(PARTITION BY sub.ParentContentID ORDER BY CASE WHEN ISNULL(sub.LibTitle,'') <> '' THEN 1 ELSE 2 END asc, sub.Contenttext asc) as pos
      FROM #tmpUpdate sub
     ) x
 WHERE x.pos = 1
 )

----BEGIN TESTS--
 if(@isTest = 1)
  BEGIN
		select Count(*), 'Should be Zero - not exactly one BaseFlag set to non 0 for each Parent Item' FROM #tmpUpdate TU
		OUTER APPLY
		 (select numBaseFlagSet = SUM(CASE WHEN sub.BaseFlag > 0 THEN 1 ELSE 0 END)
		  FROM #tmpUpdate sub
		  where sub.ParentContentID = TU.ParentContentID
		 ) sub
		where numBaseFlagSet <> 1

		select Count(*), 'Should be Zero - 0 Lib Docs, BaseFlag is 1' FROM #tmpUpdate TU
		where numLibCP = 0 and BaseFlag = 1

		select Count(*), 'Should be Zero - at least 1 Lib Docs, BaseFlag is 2' FROM #tmpUpdate TU
		where numLibCP > 0 and BaseFlag = 2

		select Count(*), 'Should be Zero - 1 Lib Docs, BaseFlag not 1 for that Lib doc' FROM #tmpUpdate TU
		where numLibCP = 1 and LibTitle <> '' and BaseFlag <> 1

		select Count(*), 'Should be Zero - 1 Lib Docs, BaseFlag not 0 for ones without Lib Doc' FROM #tmpUpdate TU
		where numLibCP = 1 and LibTitle = '' and BaseFlag <> 0

		select Count(*), 'Should be Zero - 1 CP, no Lib Docs, BaseFlag not 2' FROM #tmpUpdate TU
		where numLibCP = 0 and numCP = 1 and BaseFlag <> 2

		select Count(*), 'Should be Zero - more than 1 Lib Docs, BaseFlag is 1' FROM #tmpUpdate TU
		where numLibCP = 0 and BaseFlag = 1

		select Count(*), 'Should be Zero - not exactly one BaseFlag set to non 0 for each Parent Item' FROM #tmpUpdate TU
		OUTER APPLY
		 (select numBaseFlagSet = SUM(CASE WHEN sub.BaseFlag > 0 THEN 1 ELSE 0 END)
		  FROM #tmpUpdate sub
		  where sub.ParentContentID = TU.ParentContentID
		 ) sub
		where numBaseFlagSet <> 1

		select Count(*), 'Should be Zero - 0 Lib Docs, BaseFlag is 1' FROM #tmpUpdate TU
		where numLibCP = 0
		and BaseFlag = 1

		--all Parents should have exactly 1 Baseflag=1 or BaseFlage = 2
		select 'Should be No Records where not a BaseFlag 1 or 2' 
		select NumNotBaseFlag12 = Count(*) 
		FROM #tmpUpdate TU
		Group by ParentContentID 
		HAVING SUM(CASE WHEN BaseFlag in (1,2) THEN 1 ELSE 0 END) <> 1

		select 'Should be No Records where with both a BaseFlag 1 and 2' 
		select NumBothBaseFlag12 = Count(*) 
		FROM #tmpUpdate TU
		Group by ParentContentID 
		HAVING SUM(BaseFlag) > 2

  END 
  --END TESTS--

--BaseFlag
-- 0 = a Cover Page that will be deleted
-- 1 = is base item (Cover Page will get renamed and applicability set to all)
-- 2 = would be base item but not linked to Lib document (Cover Page will get renamed and applicability set to all + will need linked to library doc)

----Update config for Coverpage 1 to remove <MasterSlave Applicability="1" />
----from that config
----cover page 1s
 declare @Cont TABLE
 (
 	ContentID int,
 	ItemID int,
 	xConfig xml
 )
 insert into @Cont
 SELECT tU.ContentID, ItemID, xConfig = CAST(tblContents.config AS xml) FROM 
 tblContents
 INNER JOIN 
 #tmpUpdate tU ON tU.ContentID = tblContents.ContentID
 where tU.BaseFlag > 0
 
 if(@isTest = 1)
 BEGIN
 	select WRD='Have Masterslave in xconfig', NumwithMasterSlave = Count(*) FROM @Cont CNT
 	INNER JOIN 
 	tblContents ON CNT.ContentID = tblContents.ContentID
 	where CAST(xConfig AS varchar(max)) like '%MasterSlave%'
 END
 
 Update @Cont Set  xConfig.modify('delete //MasterSlave') From @Cont;
 
 if(@isTest = 1)
  BEGIN
 	select WRD='None should have Masterslave Removed in xconfig', NumwithMasterSlave = Count(*) FROM @Cont CNT
 	INNER JOIN 
 	tblContents ON CNT.ContentID = tblContents.ContentID
 	where CAST(xConfig AS varchar(max)) like '%MasterSlave%'

	select 'Show Records and how the ids will be re-linked'

	Select tblItems.ItemID, tblItems.ContentID, tblItems.PreviousID, tblContents.Text,
	PreviousItemID = tU.ItemID, PreviousContentID = tU.ContentID, PreviousText = tUCont.Text,
	RelinkToItemID = IdToSwapTO.ItemID, RelinkToContentID = IdToSwapTO.ContentID, RelinkToText = IdToSwapTOCont.Text
	FROM
	tblItems
	INNER JOIN
	tblContents on tblContents.ContentID = tblItems.ContentID
	INNER JOIN
    #tmpUpdate tU ON tblItems.PreviousID = tU.ItemID AND tU.BaseFlag = 0
	INNER JOIN
	tblContents tUCont on tUCont.ContentID = tU.ContentID
 	LEFT OUTER JOIN #tmpUpdate IdToSwapTO ON IdToSwapTO.ParentContentID = tU.ParentContentID AND IdToSwapTO.BaseFlag IN (1,2) 
	LEFT OUTER JOIN tblContents IdToSwapTOCont on IdToSwapTOCont.ContentID = IdToSwapTO.ContentID

  END
 ELSE
 BEGIN
 	--Update Config for Contents and set Text = 'Cover Page'
 	Update tblContents SET Text = 'Cover Page', Config = CAST(xConfig AS varchar(max)), 
 	   DTS = GETDATE(), UserID = 'CPVolian2026'
 	FROM 
 	@Cont CNT INNER JOIN 
 	tblContents ON CNT.ContentID = tblContents.ContentID;
 
    --Update items PreviousIds
	UPDATE tblItems Set PreviousID = IdToSwapTO.ItemID
	FROM
	tblItems
	INNER JOIN
    #tmpUpdate tU ON tblItems.PreviousID = tU.ItemID AND tU.BaseFlag = 0
 	INNER JOIN #tmpUpdate IdToSwapTO ON IdToSwapTO.ParentContentID = tU.ParentContentID AND IdToSwapTO.BaseFlag IN (1,2) 

 	--delete where BaseFlag = 0 ---Items,Content,Entries, --set DeleteStatus = 1
 	--these are ones that will be replaced by a library document
 	UPDATE tblItems Set DeleteStatus = 1, DTS = GETDATE(), UserID = 'CPVolian2026'
 	FROM
 	#tmpUpdate tU INNER JOIN 
 	tblItems ON tU.ContentID = tblItems.ContentID
 	WHERE tU.BaseFlag = 0;
 
 	UPDATE tblContents Set DeleteStatus = 1, DTS = GETDATE(), UserID = 'CPVolian2026'
 	FROM
 	#tmpUpdate tU INNER JOIN 
 	tblContents ON tU.ContentID = tblContents.ContentID
 	WHERE tU.BaseFlag = 0;

 --delete entries where Baseflag = 2
 --create new entries where Baseflag = 2
 
 	DELETE FROM
	tblEntries
	FROM
	tblEntries
	INNER JOIN 
 	#tmpUpdate tU ON tU.ContentID = tblEntries.ContentID
 	WHERE tU.BaseFlag in (0,2);
 
 	INSERT INTO [dbo].[tblEntries]
 			   ([ContentID]
 			   ,[DocID]
 			   ,[DTS]
 			   ,[UserID]
 			   ,[DeleteStatus])
 	SELECT
 		DISTINCT tU.ContentID,
 		766,  -- docid 766 "Cover Page 1"
 		GETDATE(),
 		'CPVolian2026',
 		0
 	FROM
 	#tmpUpdate tU 
 	INNER JOIN 
 	@Cont CNT ON tU.ContentID = CNT.ContentID
 	WHERE tU.BaseFlag = 2;
 
 END;

 drop table #tmpUpdate;












