#ifndef OverbyteIcsX509CertsTst1H
#define OverbyteIcsX509CertsTst1H

#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 <Vcl.Buttons.hpp>
#include <Vcl.Dialogs.hpp>
#include <Vcl.Grids.hpp>

#include "OverbyteIcsTypes.hpp"
#include "OverbyteIcsSslX509Certs.hpp"
#include "OverbyteIcsSslUtils.hpp"

#include <memory>

class TX509CertsForm : public TForm
{
__published:
    TMemo *LogWin;
    TPageControl *PageControl1;
    TTabSheet *TabAcmeSuppliers;
    TLabel *Label31;
    TListView *SupplierList;
    TGroupBox *GroupBox2;
    TLabel *Label8;
    TRadioGroup *AcmeSupplier;
    TEdit *SupplierTitle;
    TButton *doAccSaveNew;
    TButton *doAccImport;
    TButton *doAccDelete;
    TButton *doAccOpenOld;
    TButton *doAccClose;
    TButton *doExit;
    TButton *doWebHelpPage;
    TEdit *DirCertWork;
    TBitBtn *SelDirAcmeAcc;
    TTabSheet *TabSupplierDetails;
    TGroupBox *BoxSupplierDetails;
    TLabel *Label32;
    TLabel *Label50;
    TLabel *Label4;
    TLabel *Label6;
    TLabel *Label7;
    TLabel *Label54;
    TLabel *Label1;
    TLabel *Label14;
    TLabel *LabelDB;
    TComboBox *AccAcmeKeyType;
    TEdit *SupplierEmail;
    TEdit *AcmeAccountNum;
    TEdit *AcmeEABKid;
    TEdit *AcmeEABHmacKey;
    TComboBox *IpSocFamily;
    TEdit *ProxyURL;
    TButton *doAccSuppSave;
    TComboBox *DebugLogging;
    TCheckBox *LogPkeys;
    TCheckBox *LogJson;
    TButton *doSupplierWeb;
    TButton *doAccSuppClose;
    TGroupBox *GroupBox1;
    TLabel *Label29;
    TLabel *Label3;
    TLabel *LabelWebServer;
    TButton *doStartLocalWeb;
    TComboBox *DomWebSrvIP;
    TComboBox *DomWebSrvIP2;
    TButton *doStopLocalWeb;
    TTabSheet *TabCommon;
    TLabel *Label15;
    TLabel *Label41;
    TLabel *Label5;
    TLabel *Label11;
    TLabel *Label12;
    TEdit *DirLogs;
    TRadioGroup *PrivKeyCipher;
    TEdit *PrivKeyPassword;
    TBitBtn *SelDirLogs;
    TComboBox *DnsChlgType;
    TCheckBox *DnsSkipLocalTest;
    TEdit *AccCloseMins;
    TTabSheet *TabSupplierOrders;
    TButton *doDBCheck;
    TButton *doDBFinalOrder;
    TListView *DatabaseDomains;
    TButton *doDBRevoke;
    TButton *doDBCollect;
    TButton *doDBCancel;
    TButton *doDBRemove;
    TButton *doDBRedist;
    TButton *doDBListChallg;
    TButton *doDBStartOrder;
    TButton *doDBResetOrder;
    TButton *doDBAccClose;
    TButton *doDBEditOrder;
    TButton *doDBRenewal;
    TButton *doDBOrderStatus;
    TScrollBox *ScrollBoxDomain;
    TLabel *LabelInfoDomain;
    TTabSheet *TabChallenges;
    TLabel *Label47;
    TListView *DatabaseChallg;
    TTabSheet *TabDomain;
    TLabel *Label9;
    TLabel *Label23;
    TLabel *Label16;
    TStringGrid *CertSANGrid;
    TEdit *CertCommonName;
    TButton *doClearDomain;
    TGroupBox *BoxCertFmts;
    TCheckBox *CertOutFmtSep;
    TCheckBox *CertOutFmtBudl;
    TCheckBox *CertOutFmtP12;
    TCheckBox *CertOutFmtP7;
    TCheckBox *CertOutFmtReq;
    TCheckBox *CertPwPemKeys;
    TCheckBox *CertPwPkcs12;
    TCheckBox *CertWindowsStore;
    TRadioGroup *CertMsStoreLoc;
    TTabSheet *TabInfo;
    TLabel *lbCountry;
    TLabel *lbState;
    TLabel *lbLocality;
    TLabel *lbOrganization;
    TLabel *lbOrganizationalUnit;
    TLabel *lbEMail;
    TLabel *Label17;
    TLabel *Label18;
    TLabel *Label19;
    TLabel *Label20;
    TLabel *Label21;
    TLabel *Label24;
    TEdit *CertCountry;
    TEdit *CertState;
    TEdit *CertLocality;
    TEdit *CertOrganization;
    TEdit *CertOrganizationalUnit;
    TEdit *CertContactEmail;
    TEdit *CertContactFirst;
    TEdit *CertContactLast;
    TEdit *CertPhone;
    TEdit *CertAddress;
    TEdit *CertPostCode;
    TEdit *CertContactTitle;
    TRadioGroup *PrivKeyType;
    TRadioGroup *CertSignDigestType;
    TRadioGroup *CertSerNumType;
    TTabSheet *TabNewOrderr;
    TLabel *LabelAcme2Info;
    TLabel *Label51;
    TLabel *Label52;
    TLabel *Label2;
    TLabel *Label13;
    TLabel *Label10;
    TLabel *Label42;
    TButton *doAcmeCheckOrder;
    TButton *doAcmeStartChallng;
    TButton *doAcmeCollectCert;
    TButton *doAcmeSaveOrder;
    TButton *doAcmeStartOrder;
    TButton *doAcmeTestChallng;
    TRadioGroup *SuppCertChallenge;
    TCheckBox *AutoOrderComplete;
    TRadioGroup *CertCsrOrigin;
    TBitBtn *SelCertOldPrvKey;
    TBitBtn *SelCertOldCsrFile;
    TButton *doCheckCSR;
    TEdit *CertOldPrvKey;
    TEdit *CertOldCsrFile;
    TEdit *DirWellKnown;
    TEdit *DirPubWebCert;
    TBitBtn *SelDirWellKnown;
    TBitBtn *SelDirPubWebCert;
    TComboBox *CertProfile;
    TButton *doAcmeOrderClose;
    TEdit *CertValidity;
    TButton *doAcmeOrderStatus;
    TButton *doAcmeFinalOrder;
    TTabSheet *TabOwnCA;
    TLabel *Label48;
    TLabel *LabelCertOwnCA;
    TGroupBox *CABox;
    TLabel *Label44;
    TLabel *Label46;
    TLabel *LabelOwnCA;
    TLabel *Label49;
    TLabel *Label28;
    TEdit *CAPkeyFile;
    TEdit *CACertFile;
    TBitBtn *SelCACertFile;
    TBitBtn *SelCAPkeyFile;
    TButton *doLoadCA;
    TEdit *CAPkeyPw;
    TButton *doSelfSigned;
    TButton *doCASignCert;
    TEdit *OwnCACertDir;
    TBitBtn *SelOwnCACertDir;
    TCheckBox *SelfSignedCA;
    TSslX509Certs *X509Certs1;
    TOpenDialog *OpenDirDiag;
    TOpenDialog *OpenFileDlg;
    TTimer *CloseTimer;
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall FormDestroy(TObject *Sender);
    void __fastcall FormShow(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
    void __fastcall doAcmeCheckOrderClick(TObject *Sender);
    void __fastcall doAcmeStartChallngClick(TObject *Sender);
    void __fastcall doAcmeCollectCertClick(TObject *Sender);
    void __fastcall X509Certs1CertProg(TObject *Sender, TLogOption LogOption, const String Msg);
    void __fastcall X509Certs1NewCert(TObject *Sender);
    void __fastcall X509Certs1ChallengeDNS(TObject *Sender, const TChallengeItem &ChallengeItem, bool &ChlgOK);
    void __fastcall X509Certs1ChallengeEmail(TObject *Sender, const TChallengeItem &ChallengeItem, bool &ChlgOK);
    void __fastcall X509Certs1ChallengeFTP(TObject *Sender, const TChallengeItem &ChallengeItem, bool &ChlgOK);
    void __fastcall DatabaseDomainsClick(TObject *Sender);
    void __fastcall doDBCheckClick(TObject *Sender);
    void __fastcall doDBFinalOrderClick(TObject *Sender);
    void __fastcall doClearDomainClick(TObject *Sender);
    void __fastcall doAccCloseClick(TObject *Sender);
    void __fastcall SelCACertFileClick(TObject *Sender);
    void __fastcall doLoadCAClick(TObject *Sender);
    void __fastcall SelCAPkeyFileClick(TObject *Sender);
    void __fastcall SelDirLogsClick(TObject *Sender);
    void __fastcall SelCertOldCsrFileClick(TObject *Sender);
    void __fastcall SelCertOldPrvKeyClick(TObject *Sender);
    void __fastcall SelDirWellKnownClick(TObject *Sender);
    void __fastcall SelDirPubWebCertClick(TObject *Sender);
    void __fastcall doCheckCSRClick(TObject *Sender);
    void __fastcall doCASignCertClick(TObject *Sender);
    void __fastcall doSelfSignedClick(TObject *Sender);
    void __fastcall SelOwnCACertDirClick(TObject *Sender);
    void __fastcall doDBCollectClick(TObject *Sender);
    void __fastcall doDBCancelClick(TObject *Sender);
    void __fastcall doDBRevokeClick(TObject *Sender);
    void __fastcall doDBRemoveClick(TObject *Sender);
    void __fastcall X509Certs1ChallgRefresh(TObject *Sender);
    void __fastcall X509Certs1DomainsRefresh(TObject *Sender);
    void __fastcall X509Certs1SuppDBRefresh(TObject *Sender);
    void __fastcall doAcmeSaveOrderClick(TObject *Sender);
    void __fastcall doDBRedistClick(TObject *Sender);
    void __fastcall DirLogsExit(TObject *Sender);
    void __fastcall DatabaseDomainsSelectItem(TObject *Sender, TListItem *Item, bool Selected);
    void __fastcall doDBListChallgClick(TObject *Sender);
    void __fastcall doAcmeStartOrderClick(TObject *Sender);
    void __fastcall doAcmeTestChallngClick(TObject *Sender);
    void __fastcall doDBStartOrderClick(TObject *Sender);
    void __fastcall doDBResetOrderClick(TObject *Sender);
    void __fastcall SupplierListClick(TObject *Sender);
    void __fastcall doAccSaveNewClick(TObject *Sender);
    void __fastcall doAccImportClick(TObject *Sender);
    void __fastcall doAccDeleteClick(TObject *Sender);
    void __fastcall doAccSuppSaveClick(TObject *Sender);
    void __fastcall doAccOpenOldClick(TObject *Sender);
    void __fastcall SelDirAcmeAccClick(TObject *Sender);
    void __fastcall SupplierChanged(TObject *Sender);
    void __fastcall PageControl1Changing(TObject *Sender, bool &AllowChange);
    void __fastcall doSupplierWebClick(TObject *Sender);
    void __fastcall doDBEditOrderClick(TObject *Sender);
    void __fastcall doDBRenewalClick(TObject *Sender);
    void __fastcall doExitClick(TObject *Sender);
    void __fastcall AcmeSupplierClick(TObject *Sender);
    void __fastcall doDBOrderStatusClick(TObject *Sender);
    void __fastcall doAcmeOrderStatusClick(TObject *Sender);
    void __fastcall doAcmeFinalOrderClick(TObject *Sender);
    void __fastcall SupplierListDblClick(TObject *Sender);
    void __fastcall CloseTimerTimer(TObject *Sender);
    void __fastcall X509Certs1GeoEvent(TObject *Sender, const String IpStr, String &Geo);
    void __fastcall doWebHelpPageClick(TObject *Sender);

private:
    String FProgDir;
    String FIniFileName;
    bool FInitialized = false;
    std::unique_ptr<TIcsBuffLogStream> FIcsBuffLogStream;
    bool FSuplierDetailsChanged = false;
    LongWord FLastActivityTick = 0;
    void AddLog(const String &S);
    bool SetCertParams(bool CACert = false);
    bool SkipLocalDnsTest();
    void ResetOrderButtons();
    void RefreshDomains();
    void ResetDomButtons();
    void SetDomButtons();
    void SetAcmeOrderButtons();
    void OpenLogFile();
    void LoadSelectedOrder();
    void ReadAcmeAccounts();
    void LoadSettings();
    void SaveSettings();
    void TouchActivity();
    bool AccountMatches();
    int SelectedDomain();
    bool SelectFile(TEdit *Edit);
    void SelectDir(TEdit *Edit);

public:
    __fastcall TX509CertsForm(TComponent *Owner);
};

extern PACKAGE TX509CertsForm *X509CertsForm;

#endif
