using System.Collections.Generic;
using SabreTools.Core;
using SabreTools.Core.Tools;
using SabreTools.DatItems;
using SabreTools.DatItems.Formats;
using SabreTools.Logging;
namespace SabreTools.Filtering
{
///
/// Represents the filtering operations that need to be performed on a set of items, usually a DAT
///
public class DatItemFilter : Filter
{
#region Fields
#region Filters
public FilterItem AltName { get; private set; } = new FilterItem();
public FilterItem AltTitle { get; private set; } = new FilterItem();
public FilterItem Analog_Mask { get; private set; } = new FilterItem();
public FilterItem ArchiveDotOrgFormat { get; private set; } = new FilterItem();
public FilterItem ArchiveDotOrgSource { get; private set; } = new FilterItem();
public FilterItem AreaEndianness { get; private set; } = new FilterItem() { Positive = Endianness.NULL, Negative = Endianness.NULL };
public FilterItem AreaName { get; private set; } = new FilterItem();
public FilterItem AreaSize { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem AreaWidth { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Bios { get; private set; } = new FilterItem();
public FilterItem Boot { get; private set; } = new FilterItem();
public FilterItem Categories { get; private set; } = new FilterItem();
public FilterItem Channels { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem ChipType { get; private set; } = new FilterItem() { Positive = Core.ChipType.NULL, Negative = Core.ChipType.NULL };
public FilterItem Clock { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Clone { get; private set; } = new FilterItem();
public FilterItem CocktailStatus { get; private set; } = new FilterItem() { Positive = Core.SupportStatus.NULL, Negative = Core.SupportStatus.NULL };
public FilterItem Coins { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Complete { get; private set; } = new FilterItem();
public FilterItem Condition_Mask { get; private set; } = new FilterItem();
public FilterItem Condition_Relation { get; private set; } = new FilterItem() { Positive = Core.Relation.NULL, Negative = Core.Relation.NULL };
public FilterItem Condition_Tag { get; private set; } = new FilterItem();
public FilterItem Condition_Value { get; private set; } = new FilterItem();
public FilterItem Content { get; private set; } = new FilterItem();
public FilterItem Control_Buttons { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Control_KeyDelta { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Control_Maximum { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Control_Minimum { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Control_Player { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Control_ReqButtons { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Control_Reverse { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Control_Sensitivity { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Control_Type { get; private set; } = new FilterItem() { Positive = ControlType.NULL, Negative = ControlType.NULL };
public FilterItem Control_Ways { get; private set; } = new FilterItem();
public FilterItem Control_Ways2 { get; private set; } = new FilterItem();
public FilterItem Control_Ways3 { get; private set; } = new FilterItem();
public FilterItem CRC { get; private set; } = new FilterItem();
public FilterItem Date { get; private set; } = new FilterItem();
public FilterItem Default { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Description { get; private set; } = new FilterItem();
public FilterItem DeviceType { get; private set; } = new FilterItem() { Positive = Core.DeviceType.NULL, Negative = Core.DeviceType.NULL };
public FilterItem DevStatus { get; private set; } = new FilterItem();
public FilterItem DisplayType { get; private set; } = new FilterItem() { Positive = Core.DisplayType.NULL, Negative = Core.DisplayType.NULL };
public FilterItem EmulationStatus { get; private set; } = new FilterItem() { Positive = Core.SupportStatus.NULL, Negative = Core.SupportStatus.NULL };
public FilterItem Extension_Name { get; private set; } = new FilterItem();
public FilterItem FeatureOverall { get; private set; } = new FilterItem() { Positive = Core.FeatureStatus.NULL, Negative = Core.FeatureStatus.NULL };
public FilterItem FeatureStatus { get; private set; } = new FilterItem() { Positive = Core.FeatureStatus.NULL, Negative = Core.FeatureStatus.NULL };
public FilterItem FeatureType { get; private set; } = new FilterItem() { Positive = Core.FeatureType.NULL, Negative = Core.FeatureType.NULL };
public FilterItem Filter { get; private set; } = new FilterItem();
public FilterItem FixedImage { get; private set; } = new FilterItem();
public FilterItem FlipX { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem HBEnd { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem HBStart { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Height { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem HTotal { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Incomplete { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Index { get; private set; } = new FilterItem();
public FilterItem Instance_BriefName { get; private set; } = new FilterItem();
public FilterItem Instance_Name { get; private set; } = new FilterItem();
public FilterItem Interface { get; private set; } = new FilterItem();
public FilterItem Inverted { get; private set; } = new FilterItem();
public FilterItem Language { get; private set; } = new FilterItem();
public FilterItem Languages { get; private set; } = new FilterItem();
public FilterItem LoadFlag { get; private set; } = new FilterItem() { Positive = Core.LoadFlag.NULL, Negative = Core.LoadFlag.NULL };
public FilterItem Location_Inverted { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Location_Name { get; private set; } = new FilterItem();
public FilterItem Location_Number { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Mandatory { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Mask { get; private set; } = new FilterItem();
public FilterItem MD5 { get; private set; } = new FilterItem();
public FilterItem Merge { get; private set; } = new FilterItem();
public FilterItem MIA { get; private set; } = new FilterItem();
public FilterItem Name { get; private set; } = new FilterItem();
public FilterItem NoSoundHardware { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Number { get; private set; } = new FilterItem();
public FilterItem Offset { get; private set; } = new FilterItem();
public FilterItem OpenMSXSubType { get; private set; } = new FilterItem() { Positive = Core.OpenMSXSubType.NULL, Negative = Core.OpenMSXSubType.NULL };
public FilterItem OpenMSXType { get; private set; } = new FilterItem();
public FilterItem Optional { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Original { get; private set; } = new FilterItem();
public FilterItem OriginalFilename { get; private set; } = new FilterItem();
public FilterItem Part_Feature_Name { get; private set; } = new FilterItem();
public FilterItem Part_Feature_Value { get; private set; } = new FilterItem();
public FilterItem Part_Interface { get; private set; } = new FilterItem();
public FilterItem Part_Name { get; private set; } = new FilterItem();
public FilterItem PixClock { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Physical { get; private set; } = new FilterItem();
public FilterItem Players { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Refresh { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Region { get; private set; } = new FilterItem();
public FilterItem RegParent { get; private set; } = new FilterItem();
public FilterItem Relation { get; private set; } = new FilterItem() { Positive = Core.Relation.NULL, Negative = Core.Relation.NULL };
public FilterItem Remark { get; private set; } = new FilterItem();
public FilterItem RequiresArtwork { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Rotate { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Rotation { get; private set; } = new FilterItem();
public FilterItem SaveStateStatus { get; private set; } = new FilterItem() { Positive = Supported.NULL, Negative = Supported.NULL };
public FilterItem Service { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Setting_Default { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Setting_Name { get; private set; } = new FilterItem();
public FilterItem Setting_Value { get; private set; } = new FilterItem();
public FilterItem SHA1 { get; private set; } = new FilterItem();
public FilterItem SHA256 { get; private set; } = new FilterItem();
public FilterItem SHA384 { get; private set; } = new FilterItem();
public FilterItem SHA512 { get; private set; } = new FilterItem();
public FilterItem Size { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem SlotOption_Default { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem SlotOption_DeviceName { get; private set; } = new FilterItem();
public FilterItem SlotOption_Name { get; private set; } = new FilterItem();
public FilterItem SoftwareListStatus { get; private set; } = new FilterItem() { Positive = Core.SoftwareListStatus.None, Negative = Core.SoftwareListStatus.None };
public FilterItem SpamSum { get; private set; } = new FilterItem();
public FilterItem Status { get; private set; } = new FilterItem() { Positive = ItemStatus.NULL, Negative = ItemStatus.NULL };
public FilterItem Summation { get; private set; } = new FilterItem();
public FilterItem SupportStatus { get; private set; } = new FilterItem() { Positive = Core.SupportStatus.NULL, Negative = Core.SupportStatus.NULL };
public FilterItem Tag { get; private set; } = new FilterItem();
public FilterItem Tilt { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Type { get; private set; } = new FilterItem();
public FilterItem Unofficial { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Value { get; private set; } = new FilterItem();
public FilterItem VBEnd { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem VBStart { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem VTotal { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Width { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem Writable { get; private set; } = new FilterItem() { Neutral = null };
#endregion
///
/// Determines if any filters have been set
///
public bool HasFilters { get; set; } = false;
#endregion // Fields
#region Constructors
///
/// Constructor
///
public DatItemFilter()
{
logger = new Logger(this);
}
#endregion
#region Population
///
/// Set multiple filters from key
///
/// Key for the filter to be set
/// List of values for the filter
/// True if negative filter, false otherwise
public void SetFilter(DatItemField key, List values, bool negate)
{
foreach (string value in values)
{
SetFilter(key, value, negate);
}
}
///
/// Set a single filter from key
///
/// Key for the filter to be set
/// Value of the filter
/// True if negative filter, false otherwise
public void SetFilter(DatItemField key, string? value, bool negate)
{
switch (key)
{
case DatItemField.AltName:
SetStringFilter(AltName, value, negate);
break;
case DatItemField.AltTitle:
SetStringFilter(AltTitle, value, negate);
break;
case DatItemField.Analog_Mask:
SetStringFilter(Analog_Mask, value, negate);
break;
case DatItemField.ArchiveDotOrgFormat:
SetStringFilter(ArchiveDotOrgFormat, value, negate);
break;
case DatItemField.ArchiveDotOrgSource:
SetStringFilter(ArchiveDotOrgSource, value, negate);
break;
case DatItemField.AreaEndianness:
if (negate)
AreaEndianness.Negative |= value.AsEnumValue();
else
AreaEndianness.Positive |= value.AsEnumValue();
break;
case DatItemField.AreaName:
SetStringFilter(AreaName, value, negate);
break;
case DatItemField.AreaSize:
SetLongFilter(AreaSize, value, negate);
break;
case DatItemField.AreaWidth:
SetLongFilter(AreaWidth, value, negate);
break;
case DatItemField.Bios:
SetStringFilter(Bios, value, negate);
break;
case DatItemField.Boot:
SetStringFilter(Boot, value, negate);
break;
case DatItemField.Categories:
SetStringFilter(Categories, value, negate);
break;
case DatItemField.Channels:
SetLongFilter(Channels, value, negate);
break;
case DatItemField.ChipType:
if (negate)
ChipType.Negative |= value.AsEnumValue();
else
ChipType.Positive |= value.AsEnumValue();
break;
case DatItemField.Clock:
SetLongFilter(Clock, value, negate);
break;
case DatItemField.Clone:
SetStringFilter(Clone, value, negate);
break;
case DatItemField.CocktailStatus:
if (negate)
CocktailStatus.Negative |= value.AsEnumValue();
else
CocktailStatus.Positive |= value.AsEnumValue