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?
/// TODO: Field name for filter population needs to be overhauled
public class Filter
{
#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 };
// Displays
public FilterItem Machine_Displays { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Display_Tag { get; private set; } = new FilterItem();
public FilterItem Machine_Display_Type { get; private set; } = new FilterItem();
public FilterItem Machine_Display_Rotate { get; private set; } = new FilterItem();
public FilterItem Machine_Display_FlipX { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Display_Width { get; private set; } = new FilterItem();
public FilterItem Machine_Display_Height { get; private set; } = new FilterItem();
public FilterItem Machine_Display_Refresh { get; private set; } = new FilterItem();
public FilterItem Machine_Display_PixClock { get; private set; } = new FilterItem();
public FilterItem Machine_Display_HTotal { get; private set; } = new FilterItem();
public FilterItem Machine_Display_HBEnd { get; private set; } = new FilterItem();
public FilterItem Machine_Display_HBStart { get; private set; } = new FilterItem();
public FilterItem Machine_Display_VTotal { get; private set; } = new FilterItem();
public FilterItem Machine_Display_VBEnd { get; private set; } = new FilterItem();
public FilterItem Machine_Display_VBStart { get; private set; } = new FilterItem();
// Sounds
public FilterItem Machine_Sounds { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Sound_Channels { get; private set; } = new FilterItem();
// Conditions
public FilterItem Machine_Conditions { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Condition_Tag { get; private set; } = new FilterItem();
public FilterItem Machine_Condition_Mask { get; private set; } = new FilterItem();
public FilterItem Machine_Condition_Relation { get; private set; } = new FilterItem();
public FilterItem Machine_Condition_Value { get; private set; } = new FilterItem();
// Inputs
public FilterItem Machine_Inputs { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Input_Service { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Input_Tilt { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Input_Players { get; private set; } = new FilterItem();
public FilterItem Machine_Input_Coins { get; private set; } = new FilterItem();
// Inputs.Controls
public FilterItem Machine_Input_Controls { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Input_Control_Type { get; private set; } = new FilterItem();
public FilterItem Machine_Input_Control_Player { get; private set; } = new FilterItem();
public FilterItem Machine_Input_Control_Buttons { get; private set; } = new FilterItem();
public FilterItem Machine_Input_Control_RegButtons { get; private set; } = new FilterItem();
public FilterItem Machine_Input_Control_Minimum { get; private set; } = new FilterItem();
public FilterItem Machine_Input_Control_Maximum { get; private set; } = new FilterItem();
public FilterItem Machine_Input_Control_Sensitivity { get; private set; } = new FilterItem();
public FilterItem Machine_Input_Control_KeyDelta { get; private set; } = new FilterItem();
public FilterItem Machine_Input_Control_Reverse { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Input_Control_Ways { get; private set; } = new FilterItem();
public FilterItem Machine_Input_Control_Ways2 { get; private set; } = new FilterItem();
public FilterItem Machine_Input_Control_Ways3 { get; private set; } = new FilterItem();
// DipSwitches
public FilterItem Machine_DipSwitches { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_DipSwitch_Name { get; private set; } = new FilterItem();
public FilterItem Machine_DipSwitch_Tag { get; private set; } = new FilterItem();
public FilterItem Machine_DipSwitch_Mask { get; private set; } = new FilterItem();
// DipSwitches.Locations
public FilterItem Machine_DipSwitch_Locations { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_DipSwitch_Location_Name { get; private set; } = new FilterItem();
public FilterItem Machine_DipSwitch_Location_Number { get; private set; } = new FilterItem();
public FilterItem Machine_DipSwitch_Location_Inverted { get; private set; } = new FilterItem() { Neutral = null };
// DipSwitches.Values
public FilterItem Machine_DipSwitch_Values { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_DipSwitch_Value_Name { get; private set; } = new FilterItem();
public FilterItem Machine_DipSwitch_Value_Value { get; private set; } = new FilterItem();
public FilterItem Machine_DipSwitch_Value_Default { get; private set; } = new FilterItem() { Neutral = null };
// Ports
public FilterItem Machine_Ports { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Port_Tag { get; private set; } = new FilterItem();
// Ports.Analogs
public FilterItem Machine_Port_Analogs { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Port_Analog_Mask { get; private set; } = new FilterItem();
// Drivers
public FilterItem Machine_Drivers { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Driver_Status { get; private set; } = new FilterItem();
public FilterItem Machine_Driver_Emulation { get; private set; } = new FilterItem();
public FilterItem Machine_Driver_Cocktail { get; private set; } = new FilterItem();
public FilterItem Machine_Driver_SaveState { get; private set; } = new FilterItem();
// Features
public FilterItem Machine_Features { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Feature_Type { get; private set; } = new FilterItem();
public FilterItem Machine_Feature_Status { get; private set; } = new FilterItem();
public FilterItem Machine_Feature_Overall { get; private set; } = new FilterItem();
// Devices
public FilterItem Machine_Devices { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Device_Type { get; private set; } = new FilterItem();
public FilterItem Machine_Device_Tag { get; private set; } = new FilterItem();
public FilterItem Machine_Device_FixedImage { get; private set; } = new FilterItem();
public FilterItem Machine_Device_Mandatory { get; private set; } = new FilterItem();
public FilterItem Machine_Device_Interface { get; private set; } = new FilterItem();
// Devices.Instances
public FilterItem Machine_Device_Instances { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Device_Instance_Name { get; private set; } = new FilterItem();
public FilterItem Machine_Device_Instance_BriefName { get; private set; } = new FilterItem();
// Devices.Extensions
public FilterItem Machine_Device_Extensions { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Device_Extension_Name { get; private set; } = new FilterItem();
// Slots
public FilterItem Machine_Slots { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Slot_Name { get; private set; } = new FilterItem();
// Slots.SlotOptions
public FilterItem Machine_Slot_SlotOptions { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Slot_SlotOption_Name { get; private set; } = new FilterItem();
public FilterItem Machine_Slot_SlotOption_DeviceName { get; private set; } = new FilterItem();
public FilterItem Machine_Slot_SlotOption_Default { get; private set; } = new FilterItem() { Neutral = 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 };
// Infos
public FilterItem Machine_Infos { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Info_Name { get; private set; } = new FilterItem();
public FilterItem Machine_Info_Value { get; private set; } = new FilterItem();
// SharedFeatures
public FilterItem Machine_SharedFeatures { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_SharedFeature_Name { get; private set; } = new FilterItem();
public FilterItem Machine_SharedFeature_Value { get; private set; } = new FilterItem();
#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