using System;
using System.Collections.Generic;
using SabreTools.Core;
using SabreTools.Core.Tools;
using SabreTools.Logging;
namespace SabreTools.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: Investigate how to reduce the amount of hardcoded filter statements
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 };
#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_Type { get; private set; } = new FilterItem();
#endregion
#region Item-Specific
#region Actionable
// Rom
public FilterItem DatItem_Name { get; private set; } = new FilterItem();
public FilterItem DatItem_Bios { get; private set; } = new FilterItem();
public FilterItem DatItem_Size { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
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_SpamSum { 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 (AttractMode)
public FilterItem DatItem_AltName { get; private set; } = new FilterItem();
public FilterItem DatItem_AltTitle { get; private set; } = new FilterItem();
// Rom (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();
// Rom (SoftwareList)
public FilterItem DatItem_LoadFlag { get; private set; } = new FilterItem() { Positive = LoadFlag.NULL, Negative = LoadFlag.NULL };
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_Default { get; private set; } = new FilterItem() { Neutral = null };
// Analog
public FilterItem DatItem_Analog_Mask { get; private set; } = new FilterItem();
// BiosSet
public FilterItem DatItem_Description { get; private set; } = new FilterItem();
// 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() { Positive = null, Negative = null, Neutral = null };
// Condition
public FilterItem DatItem_Mask { get; private set; } = new FilterItem();
public FilterItem DatItem_Relation { get; private set; } = new FilterItem() { Positive = Relation.NULL, Negative = Relation.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() { Positive = Relation.NULL, Negative = Relation.NULL };
public FilterItem DatItem_Condition_Value { get; private set; } = new FilterItem();
// Control
public FilterItem DatItem_Control_Type { get; private set; } = new FilterItem() { Positive = ControlType.NULL, Negative = ControlType.NULL };
public FilterItem DatItem_Control_Player { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_Control_Buttons { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_Control_ReqButtons { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_Control_Minimum { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_Control_Maximum { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_Control_Sensitivity { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_Control_KeyDelta { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_Control_Reverse { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Control_Ways { get; private set; } = new FilterItem();
public FilterItem DatItem_Control_Ways2 { get; private set; } = new FilterItem();
public FilterItem DatItem_Control_Ways3 { get; private set; } = new FilterItem();
// DataArea
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() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_AreaEndianness { get; private set; } = new FilterItem() { Positive = Endianness.NULL, Negative = Endianness.NULL };
// Device
public FilterItem DatItem_DeviceType { get; private set; } = new FilterItem() { Positive = DeviceType.NULL, Negative = DeviceType.NULL };
public FilterItem DatItem_FixedImage { get; private set; } = new FilterItem();
public FilterItem DatItem_Mandatory { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_Interface { get; private set; } = new FilterItem();
// Display
public FilterItem DatItem_DisplayType { get; private set; } = new FilterItem() { Positive = DisplayType.NULL, Negative = DisplayType.NULL };
public FilterItem DatItem_Rotate { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_FlipX { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Width { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_Height { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_Refresh { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_PixClock { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_HTotal { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_HBEnd { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_HBStart { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_VTotal { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_VBEnd { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_VBStart { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
// 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 };
// Extension
public FilterItem DatItem_Extension_Name { get; private set; } = new FilterItem();
// 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 DatItem_Service { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Tilt { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem DatItem_Players { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_Coins { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
// Instance
public FilterItem DatItem_Instance_Name { get; private set; } = new FilterItem();
public FilterItem DatItem_Instance_BriefName { get; private set; } = new FilterItem();
// Location
public FilterItem DatItem_Location_Name { get; private set; } = new FilterItem();
public FilterItem DatItem_Location_Number { get; private set; } = new FilterItem() { Positive = null, Negative = null, Neutral = null };
public FilterItem DatItem_Location_Inverted { get; private set; } = new FilterItem() { Neutral = null };
// Part
public FilterItem