using System;
using System.Collections.Generic;
using SabreTools.Library.Data;
using SabreTools.Library.DatFiles;
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 = MachineType.NULL, Negative = MachineType.NULL };
#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 };
// DeviceReferences
public FilterItem Machine_DeviceReferences { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_DeviceReference_Name { get; private set; } = new FilterItem();
// Chips
public FilterItem Machine_Chips { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Chip_Name { get; private set; } = new FilterItem();
public FilterItem Machine_Chip_Tag { get; private set; } = new FilterItem();
public FilterItem Machine_Chip_Type { get; private set; } = new FilterItem();
public FilterItem Machine_Chip_Clock { get; private set; } = new FilterItem();
// 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 };
// Configurations
public FilterItem Machine_Configurations { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Configuration_Name { get; private set; } = new FilterItem();
public FilterItem Machine_Configuration_Tag { get; private set; } = new FilterItem();
public FilterItem Machine_Configuration_Mask { get; private set; } = new FilterItem();
// Configurations.Locations
public FilterItem Machine_Configuration_Locations { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Configuration_Location_Name { get; private set; } = new FilterItem();
public FilterItem Machine_Configuration_Location_Number { get; private set; } = new FilterItem();
public FilterItem Machine_Configuration_Location_Inverted { get; private set; } = new FilterItem() { Neutral = null };
// Configurations.Settings
public FilterItem Machine_Configuration_Settings { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Configuration_Setting_Name { get; private set; } = new FilterItem();
public FilterItem Machine_Configuration_Setting_Value { get; private set; } = new FilterItem();
public FilterItem Machine_Configuration_Setting_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();
// Adjusters
public FilterItem Machine_Adjusters { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Adjuster_Name { get; private set; } = new FilterItem();
public FilterItem Machine_Adjuster_Default { get; private set; } = new FilterItem() { Neutral = null };
// Adjusters.Conditions
public FilterItem Machine_Adjuster_Conditions { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Adjuster_Condition_Tag { get; private set; } = new FilterItem();
public FilterItem Machine_Adjuster_Condition_Mask { get; private set; } = new FilterItem();
public FilterItem Machine_Adjuster_Condition_Relation { get; private set; } = new FilterItem();
public FilterItem Machine_Adjuster_Condition_Value { 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