2022-01-13 15:22:40 +00:00
using AssortValidator.Common.Helpers ;
using static AssortUpdater . AssortFlattener ;
namespace AssortUpdater
{
public static class AssortMerger
{
public static List < FlatAssort > CreateMergedFlattenedAssorts ( string trader , List < FlatAssort > flattenedLiveAssorts , List < FlatAssort > flattenedExistingAssorts )
{
var completeAssorts = new List < FlatAssort > ( ) ;
// Add live assorts
foreach ( var liveAssort in flattenedLiveAssorts )
{
completeAssorts . Add ( liveAssort ) ;
}
LoggingHelpers . LogSuccess ( $"{trader} Added {flattenedLiveAssorts.Count} items from live" ) ;
2022-01-14 11:51:57 +00:00
LoggingHelpers . LogNewLine ( ) ;
2022-01-13 15:22:40 +00:00
// Check for missing existing assorts and add those
var ExistingItemCount = 0 ;
foreach ( var existingAssort in flattenedExistingAssorts )
{
var matchInCompleteAssorts = GetMatchingAssortFromCompleteList ( trader , existingAssort , completeAssorts ) ;
if ( matchInCompleteAssorts ! = null )
{
// Match found, dont add dupe item
continue ;
}
// no assort found, add
LoggingHelpers . LogWarning ( $"{trader} Adding Item found in existing assorts but not live: {existingAssort.ItemId} {existingAssort.ItemName} Level: {existingAssort.Level}" ) ;
completeAssorts . Add ( existingAssort ) ;
ExistingItemCount + + ;
}
2022-01-14 11:51:57 +00:00
LoggingHelpers . LogNewLine ( ) ;
2022-01-13 15:22:40 +00:00
LoggingHelpers . LogSuccess ( $"{trader} Added {ExistingItemCount} existing items" ) ;
return completeAssorts ;
}
private static FlatAssort ? GetMatchingAssortFromCompleteList ( string traderName , FlatAssort assortToFind , List < FlatAssort > completeAssorts )
{
IEnumerable < FlatAssort > ? existingAssort = GetAssortByItemIdAndLevel ( assortToFind , completeAssorts ) ;
if ( SingleAssortFound ( existingAssort ) )
{
//LoggingHelpers.LogSuccess($"{traderName} match found for item: {assortToFind.ItemId} {assortToFind.ItemName} Level: {assortToFind.Level}");
return existingAssort . First ( ) ;
}
if ( MultipleAssortsFound ( existingAssort ) )
{
// Multiple matches found, be more specific
existingAssort = GetAssortByItemIdLevelAndMoney ( assortToFind , completeAssorts ) ;
if ( SingleAssortFound ( existingAssort ) )
{
return existingAssort . First ( ) ;
}
if ( MultipleAssortsFound ( existingAssort ) )
{
// Multiple matches found, be more specific...again
existingAssort = GetAssortByItemIdLevelMoneySubItemCountAndCostItemCount ( assortToFind , completeAssorts ) ;
if ( SingleAssortFound ( existingAssort ) )
{
return existingAssort . First ( ) ;
}
}
}
existingAssort = GetAssortByBarterCostAndCount ( assortToFind , completeAssorts ) ;
if ( SingleAssortFound ( existingAssort ) )
{
return existingAssort . First ( ) ;
}
//LoggingHelpers.LogError($"{traderName} No match found for item: {assortToFind.ItemId} {assortToFind.ItemName} Level: {assortToFind.Level}");
// No matches found, probably doesnt exist
return null ;
}
private static bool SingleAssortFound ( IEnumerable < FlatAssort > existingAssort )
{
return existingAssort ? . Count ( ) = = 1 ;
}
private static bool MultipleAssortsFound ( IEnumerable < FlatAssort > ? existingAssort )
{
return existingAssort ? . Count ( ) > 1 ;
}
private static IEnumerable < FlatAssort > GetAssortByItemIdLevelMoneySubItemCountAndCostItemCount ( FlatAssort assortToFind , List < FlatAssort > completeAssorts )
{
return completeAssorts . Where ( x = > x . ItemId = = assortToFind . ItemId
& & x . Level = = assortToFind . Level
& & x . IsMoney = = assortToFind . IsMoney
& & x . SubItems . Count = = assortToFind . SubItems . Count
& & x . BarterDetails [ 0 ] . count = = assortToFind . BarterDetails [ 0 ] . count ) ;
}
private static IEnumerable < FlatAssort > GetAssortByItemIdAndLevel ( FlatAssort assortToFind , List < FlatAssort > completeAssorts )
{
return completeAssorts . Where ( x = > x . ItemId = = assortToFind . ItemId
& & x . Level = = assortToFind . Level ) ;
}
private static IEnumerable < FlatAssort > GetAssortByItemIdLevelAndMoney ( FlatAssort assortToFind , List < FlatAssort > completeAssorts )
{
return completeAssorts . Where ( x = > x . ItemId = = assortToFind . ItemId
& & x . Level = = assortToFind . Level
& & x . IsMoney = = assortToFind . IsMoney ) ;
}
private static IEnumerable < FlatAssort > ? GetAssortByBarterCostAndCount ( FlatAssort assortToFind , List < FlatAssort > completeAssorts )
{
var itemsThatHaveSameCost = completeAssorts . Where ( x = > x . ItemId = = assortToFind . ItemId
& & x . Level = = assortToFind . Level ) ;
foreach ( var item in itemsThatHaveSameCost )
{
var matches = 0 ;
foreach ( var barter in item . BarterDetails )
{
var match = assortToFind . BarterDetails . Any ( x = > x . _tpl = = barter . _tpl & & x . count = = barter . count ) ;
if ( match )
{
matches + + ;
// collection already has item
}
}
if ( matches = = assortToFind . BarterDetails . Count )
{
//LoggingHelpers.LogSuccess($"{traderName} item found with same cost: {assortToFind.ItemId} {assortToFind.ItemName} Level: {assortToFind.Level}");
return new List < FlatAssort > ( ) { item } ;
}
}
return null ;
}
}
}