#ifndef OverbyteIcsNetMon1H
#define OverbyteIcsNetMon1H

#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <Vcl.ComCtrls.hpp>

#include "OverbyteIcsWSocket.hpp"
#include "OverbyteIcsUtils.hpp"
#include "OverbyteIcsIniFiles.hpp"
#include "OverbyteIcsIpUtils.hpp"
#include "OverbyteIcsDnsQuery.hpp"
#include "OverbyteIcsTypes.hpp"
#include "OverbyteIcsWndControl.hpp"
#ifdef SetPort
#undef SetPort
#endif
#include "OverbyteIcsMonCommon.hpp"
#include "OverbyteIcsMonSock.hpp"
#include "OverbyteIcsMonPcap.hpp"
#include "OverbyteIcsMonNdis.hpp"
#include "OverbyteIcsWndControl.hpp"
#include "OverbyteIcsDnsQuery.hpp"
#include "OverbyteIcsTypes.hpp"

#include <memory>
#include <vector>

//start of ini file names shared with OverbyteIcsNetMon2
namespace Netmonini {
const String SectionMainWindow = "MainWindow";
const String SectionRow1Window = "Row1Window";
const String KeyTop = "Top";
const String KeyLeft = "Left";
const String KeyWidth = "Width";
const String KeyHeight = "Height";
const String SectionData = "Data";
}

class TMonForm : public TForm
{
__published:
    TPageControl *PageControl1;
    TTabSheet *TabSettings;
    TGroupBox *GroupBox2;
    TLabel *Label3;
    TLabel *Label4;
    TLabel *LabelAdmin;
    TLabel *Label2;
    TListBox *MonIpList;
    TCheckBox *UseWinNCap;
    TListBox *MonAdptList;
    TCheckBox *ShowFullData;
    TCheckBox *ShowIgnoreData;
    TCheckBox *MonPromiscuous;
    TButton *doExit;
    TGroupBox *GroupBox3;
    TMemo *IpAddrList;
    TRadioGroup *FilterIpAddr;
    TCheckBox *IpAddrLocal;
    TGroupBox *GroupBox1;
    TLabel *LaberlPorts;
    TRadioGroup *FilterProtocol;
    TCheckBox *ProtocolIPv4;
    TCheckBox *ProtocolIPv6;
    TCheckBox *ProtocolUdp;
    TCheckBox *ProtocolARP;
    TCheckBox *ProtocolICMP;
    TCheckBox *ProtocolDns;
    TCheckBox *ProtocolNonIp;
    TCheckBox *ProtocolSyslog;
    TCheckBox *ProtocolHttp;
    TCheckBox *ProtocolSNMP;
    TCheckBox *ProtocolUPnP;
    TCheckBox *ProtocolIRC;
    TMemo *PortsList;
    TCheckBox *ProtocolBroadcast;
    TCheckBox *ProtocolTCP;
    TGroupBox *GroupBox4;
    TCheckBox *DnsCacheLog;
    TButton *doDnsCacheClear;
    TButton *doDnsCacheList;
    TTabSheet *TabPacketsLog;
    TMemo *MonLogWin;
    TPanel *Panel3;
    TLabel *LabelTrafficLog;
    TButton *doPackLogStart;
    TButton *doClearLog;
    TButton *doPackLogStop;
    TTabSheet *TabPacketsGrid;
    TListView *MonGridWin;
    TPanel *Panel2;
    TLabel *LabelTrafficGrid;
    TButton *doPackGridStart;
    TButton *doPackGridStop;
    TButton *doPackGridClear;
    TCheckBox *GridAutoScroll;
    TTabSheet *TabTraffic;
    TListView *MonTrafficWin;
    TPanel *Panel1;
    TLabel *LabelTrafficTotals;
    TButton *doTrafficStart;
    TButton *doTrafficStop;
    TButton *doTrafficClear;
    TButton *doTrafficLogTotals;
    TCheckBox *TrafficHostNames;
    TTimer *Timer;
    TIcsDomainNameCache *IcsDomainNameCache1;
    void __fastcall doExitClick(TObject *Sender);
    void __fastcall doPackLogStartClick(TObject *Sender);
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall TimerTimer(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
    void __fastcall MonAdptListClick(TObject *Sender);
    void __fastcall UseWinNCapClick(TObject *Sender);
    void __fastcall doClearLogClick(TObject *Sender);
    void __fastcall doPackLogStopClick(TObject *Sender);
    void __fastcall FilterProtocolClick(TObject *Sender);
    void __fastcall PortsListChange(TObject *Sender);
    void __fastcall ProtocolARPClick(TObject *Sender);
    void __fastcall ProtocolBroadcastClick(TObject *Sender);
    void __fastcall ProtocolDnsClick(TObject *Sender);
    void __fastcall ProtocolHttpClick(TObject *Sender);
    void __fastcall ProtocolICMPClick(TObject *Sender);
    void __fastcall ProtocolIPv4Click(TObject *Sender);
    void __fastcall ProtocolIPv6Click(TObject *Sender);
    void __fastcall ProtocolIRCClick(TObject *Sender);
    void __fastcall ProtocolNonIpClick(TObject *Sender);
    void __fastcall ProtocolSNMPClick(TObject *Sender);
    void __fastcall ProtocolSyslogClick(TObject *Sender);
    void __fastcall ProtocolTCPClick(TObject *Sender);
    void __fastcall ProtocolUdpClick(TObject *Sender);
    void __fastcall ProtocolUPnPClick(TObject *Sender);
    void __fastcall FilterIpAddrClick(TObject *Sender);
    void __fastcall IpAddrLocalClick(TObject *Sender);
    void __fastcall IpAddrListExit(TObject *Sender);
    void __fastcall FormShow(TObject *Sender);
    void __fastcall doPackGridClearClick(TObject *Sender);
    void __fastcall doPackGridStartClick(TObject *Sender);
    void __fastcall doPackGridStopClick(TObject *Sender);
    void __fastcall MonGridWinData(TObject *Sender, TListItem *Item);
    void __fastcall MonGridWinSelectItem(TObject *Sender, TListItem *Item, bool Selected);
    void __fastcall doTrafficStartClick(TObject *Sender);
    void __fastcall doTrafficStopClick(TObject *Sender);
    void __fastcall MonTrafficWinData(TObject *Sender, TListItem *Item);
    void __fastcall doTrafficClearClick(TObject *Sender);
    void __fastcall doTrafficLogTotalsClick(TObject *Sender);
    void __fastcall doDnsCacheListClick(TObject *Sender);
    void __fastcall doDnsCacheClearClick(TObject *Sender);
    void __fastcall IcsDomainNameCache1DNLogEvent(TObject *Sender, const String Msg);

private:
    enum class TCaptureMode { None, Log, Grid, Traffic };

    std::unique_ptr<TIcsMonFilterClass> FMonitorFilter;
    std::unique_ptr<TIcsTrafficClass> FTrafficClass;
    std::unique_ptr<TIcsMonSocket> FMonitorSocket;
    std::unique_ptr<TIcsMonPcap> FMonitorPcap;
    std::unique_ptr<TStringList> FAdapterIPList;
    std::unique_ptr<TStringList> FAdapterMaskList;
    std::unique_ptr<TStringList> FAdapterBcastList;
    std::vector<TPacketInfo> FGridBuffer;
    String FBuffLogLines;
    TCaptureMode FCaptureMode = TCaptureMode::None;

    void __fastcall PacketEvent(TObject *Sender, const TPacketInfo &PacketInfo);
    void __fastcall LogEvent(TObject *Sender, const String Msg);
    void LoadIpAddrList();
    void CapButtons(bool Run);
    void CaptureStart();
    void CaptureStop();
    void LogLine(const String &Msg);
    String PacketText(const TPacketInfo &Packet, int MaxLen);

public:
    __fastcall TMonForm(TComponent *Owner);
    __fastcall ~TMonForm();
};

extern PACKAGE TMonForm *MonForm;

#endif
