using System;
using System.Collections.Generic;
using SabreTools.Library.Data;
using SabreTools.Library.DatItems;
using SabreTools.Library.Tools;
namespace SabreTools.Library.Filtering
{
///
/// Represents the filtering operations that need to be performed on a set of items, usually a DAT
///
/// TODO: Can clever use of Filtering allow for easier external splitting methods?
public class Filter
{
// TODO: Reorder once all reorganization is done
#region Fields
#region Machine Filters
#region Common
public FilterItem Machine_Name { get; private set; } = new FilterItem();
public FilterItem Machine_Comment { get; private set; } = new FilterItem();
public FilterItem Machine_Description { get; private set; } = new FilterItem();
public FilterItem Machine_Year { get; private set; } = new FilterItem();
public FilterItem Machine_Manufacturer { get; private set; } = new FilterItem();
public FilterItem Machine_Publisher { get; private set; } = new FilterItem();
public FilterItem Machine_Category { get; private set; } = new FilterItem();
public FilterItem Machine_RomOf { get; private set; } = new FilterItem();
public FilterItem Machine_CloneOf { get; private set; } = new FilterItem();
public FilterItem Machine_SampleOf { get; private set; } = new FilterItem();
public FilterItem Machine_Type { get; private set; } = new FilterItem() { Positive = 0x0, Negative = 0x0 };
#endregion
#region AttractMode
public FilterItem Machine_Players { get; private set; } = new FilterItem();
public FilterItem Machine_Rotation { get; private set; } = new FilterItem();
public FilterItem Machine_Control { get; private set; } = new FilterItem();
public FilterItem Machine_Status { get; private set; } = new FilterItem();
public FilterItem Machine_DisplayCount { get; private set; } = new FilterItem();
public FilterItem Machine_DisplayType { get; private set; } = new FilterItem();
public FilterItem Machine_Buttons { get; private set; } = new FilterItem();
#endregion
#region ListXML
public FilterItem Machine_SourceFile { get; private set; } = new FilterItem();
public FilterItem Machine_Runnable { get; private set; } = new FilterItem() { Positive = Runnable.NULL, Negative = Runnable.NULL };
#endregion
#region Logiqx
public FilterItem Machine_Board { get; private set; } = new FilterItem();
public FilterItem Machine_RebuildTo { get; private set; } = new FilterItem();
#endregion
#region Logiqx EmuArc
public FilterItem Machine_TitleID { get; private set; } = new FilterItem();
public FilterItem Machine_Developer { get; private set; } = new FilterItem();
public FilterItem Machine_Genre { get; private set; } = new FilterItem();
public FilterItem Machine_Subgenre { get; private set; } = new FilterItem();
public FilterItem Machine_Ratings { get; private set; } = new FilterItem();
public FilterItem Machine_Score { get; private set; } = new FilterItem();
public FilterItem Machine_Enabled { get; private set; } = new FilterItem();
public FilterItem Machine_CRC { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_RelatedTo { get; private set; } = new FilterItem();
#endregion
#region OpenMSX
public FilterItem Machine_GenMSXID { get; private set; } = new FilterItem();
public FilterItem Machine_System { get; private set; } = new FilterItem();
public FilterItem Machine_Country { get; private set; } = new FilterItem();
#endregion
#region SoftwareList
public FilterItem Machine_Supported { get; private set; } = new FilterItem() { Positive = Supported.NULL, Negative = Supported.NULL };
#endregion
#endregion // Machine Filters
#region DatItem Filters
#region Common
public FilterItem DatItem_Name { get; private set; } = new FilterItem();
public FilterItem DatItem_Type { get; private set; } = new FilterItem();
#endregion
#region AttractMode
public FilterItem DatItem_AltName { get; private set; } = new FilterItem();
public FilterItem DatItem_AltTitle { get; private set; } = new FilterItem();
#endregion
#region OpenMSX
public FilterItem DatItem_Original { get; private set; } = new FilterItem();
public FilterItem DatItem_OpenMSXSubType { get; private set; } = new FilterItem() { Positive = OpenMSXSubType.NULL, Negative = OpenMSXSubType.NULL };
public FilterItem DatItem_OpenMSXType { get; private set; } = new FilterItem();
public FilterItem DatItem_Remark { get; private set; } = new FilterItem();
public FilterItem DatItem_Boot { get; private set; } = new FilterItem();
#endregion
#region SoftwareList
// Part
public FilterItem DatItem_Part { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Part_Name { get; private set; } = new FilterItem();
public FilterItem DatItem_Part_Interface { get; private set; } = new FilterItem();
// Feature
public FilterItem DatItem_Features { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Feature_Name { get; private set; } = new FilterItem();
public FilterItem DatItem_Feature_Value { get; private set; } = new FilterItem();
public FilterItem DatItem_LoadFlag { get; private set; } = new FilterItem();
#endregion
#region Item-Specific
#region Actionable
// Rom
public FilterItem DatItem_Bios { get; private set; } = new FilterItem();
public FilterItem DatItem_Size { get; private set; } = new FilterItem() { Positive = -1, Negative = -1, Neutral = -1 };
public FilterItem DatItem_CRC { get; private set; } = new FilterItem();
public FilterItem DatItem_MD5 { get; private set; } = new FilterItem();
#if NET_FRAMEWORK
public FilterItem DatItem_RIPEMD160 { get; private set; } = new FilterItem();
#endif
public FilterItem DatItem_SHA1 { get; private set; } = new FilterItem();
public FilterItem DatItem_SHA256 { get; private set; } = new FilterItem();
public FilterItem DatItem_SHA384 { get; private set; } = new FilterItem();
public FilterItem DatItem_SHA512 { get; private set; } = new FilterItem();
public FilterItem DatItem_Merge { get; private set; } = new FilterItem();
public FilterItem DatItem_Region { get; private set; } = new FilterItem();
public FilterItem DatItem_Offset { get; private set; } = new FilterItem();
public FilterItem DatItem_Date { get; private set; } = new FilterItem();
public FilterItem DatItem_Status { get; private set; } = new FilterItem() { Positive = ItemStatus.NULL, Negative = ItemStatus.NULL };
public FilterItem DatItem_Optional { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Inverted { get; private set; } = new FilterItem();
// Rom (SoftwareList)
public FilterItem DatItem_AreaName { get; private set; } = new FilterItem();
public FilterItem DatItem_AreaSize { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_AreaWidth { get; private set; } = new FilterItem();
public FilterItem DatItem_AreaEndianness { get; private set; } = new FilterItem();
public FilterItem DatItem_Value { get; private set; } = new FilterItem();
// Disk
public FilterItem DatItem_Index { get; private set; } = new FilterItem();
public FilterItem DatItem_Writable { get; private set; } = new FilterItem() { Neutral = null };
#endregion
#region Auxiliary
// Adjuster
public FilterItem DatItem_Conditions { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Condition_Tag { get; private set; } = new FilterItem();
public FilterItem DatItem_Condition_Mask { get; private set; } = new FilterItem();
public FilterItem DatItem_Condition_Relation { get; private set; } = new FilterItem();
public FilterItem DatItem_Condition_Value { get; private set; } = new FilterItem();
// Analog
public FilterItem DatItem_Mask { get; private set; } = new FilterItem();
// BiosSet
public FilterItem DatItem_Description { get; private set; } = new FilterItem();
public FilterItem DatItem_Default { get; private set; } = new FilterItem() { Neutral = null };
// Chip
public FilterItem DatItem_Tag { get; private set; } = new FilterItem();
public FilterItem DatItem_ChipType { get; private set; } = new FilterItem() { Positive = ChipType.NULL, Negative = ChipType.NULL };
public FilterItem DatItem_Clock { get; private set; } = new FilterItem();
// Condition
public FilterItem DatItem_Relation { get; private set; } = new FilterItem();
// Configuration.Locations
public FilterItem DatItem_Locations { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Location_Name { get; private set; } = new FilterItem();
public FilterItem DatItem_Location_Number { get; private set; } = new FilterItem();
public FilterItem DatItem_Location_Inverted { get; private set; } = new FilterItem() { Neutral = null };
// Configuration.Settings
public FilterItem DatItem_Settings { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Setting_Name { get; private set; } = new FilterItem();
public FilterItem DatItem_Setting_Value { get; private set; } = new FilterItem();
public FilterItem DatItem_Setting_Default { get; private set; } = new FilterItem() { Neutral = null };
// Device
public FilterItem DatItem_DeviceType { get; private set; } = new FilterItem();
public FilterItem DatItem_FixedImage { get; private set; } = new FilterItem();
public FilterItem DatItem_Mandatory { get; private set; } = new FilterItem();
public FilterItem DatItem_Interface { get; private set; } = new FilterItem();
// Device.Instances
public FilterItem DatItem_Instances { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Instance_Name { get; private set; } = new FilterItem();
public FilterItem DatItem_Instance_BriefName { get; private set; } = new FilterItem();
// Device.Extensions
public FilterItem DatItem_Extensions { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Extension_Name { get; private set; } = new FilterItem();
// DipSwitch.Values
public FilterItem DatItem_Values { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Value_Name { get; private set; } = new FilterItem();
public FilterItem DatItem_Value_Value { get; private set; } = new FilterItem();
public FilterItem DatItem_Value_Default { get; private set; } = new FilterItem() { Neutral = null };
// Display
public FilterItem DatItem_DisplayType { get; private set; } = new FilterItem();
public FilterItem DatItem_Rotate { get; private set; } = new FilterItem();
public FilterItem DatItem_FlipX { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Width { get; private set; } = new FilterItem();
public FilterItem DatItem_Height { get; private set; } = new FilterItem();
public FilterItem DatItem_Refresh { get; private set; } = new FilterItem();
public FilterItem DatItem_PixClock { get; private set; } = new FilterItem();
public FilterItem DatItem_HTotal { get; private set; } = new FilterItem();
public FilterItem DatItem_HBEnd { get; private set; } = new FilterItem();
public FilterItem DatItem_HBStart { get; private set; } = new FilterItem();
public FilterItem DatItem_VTotal { get; private set; } = new FilterItem();
public FilterItem DatItem_VBEnd { get; private set; } = new FilterItem();
public FilterItem DatItem_VBStart { get; private set; } = new FilterItem();
// Driver
public FilterItem DatItem_SupportStatus { get; private set; } = new FilterItem() { Positive = SupportStatus.NULL, Negative = SupportStatus.NULL };
public FilterItem DatItem_EmulationStatus { get; private set; } = new FilterItem() { Positive = SupportStatus.NULL, Negative = SupportStatus.NULL };
public FilterItem DatItem_CocktailStatus { get; private set; } = new FilterItem() { Positive = SupportStatus.NULL, Negative = SupportStatus.NULL };
public FilterItem DatItem_SaveStateStatus { get; private set; } = new FilterItem() { Positive = Supported.NULL, Negative = Supported.NULL };
// Feature
public FilterItem DatItem_FeatureType { get; private set; } = new FilterItem() { Positive = FeatureType.NULL, Negative = FeatureType.NULL };
public FilterItem DatItem_FeatureStatus { get; private set; } = new FilterItem() { Positive = FeatureStatus.NULL, Negative = FeatureStatus.NULL };
public FilterItem DatItem_FeatureOverall { get; private set; } = new FilterItem() { Positive = FeatureStatus.NULL, Negative = FeatureStatus.NULL };
// Input
public FilterItem