#ifndef OverbyteIcsHttpRestTst1H
#define OverbyteIcsHttpRestTst1H

#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 "OverbyteIcsSuperObject.hpp"
#include "OverbyteIcsSslHttpRest.hpp"
#include "OverbyteIcsSslHttpOAuth.hpp"
#include "OverbyteIcsDnsHttps.hpp"
#include "OverbyteIcsSmtpProt.hpp"
#include "OverbyteIcsOAuthFormVclE.hpp"
#include "OverbyteIcsWebSocketCli.hpp"
#include "OverbyteIcsSslUtils.hpp"
#include "OverbyteIcsDnsQuery.hpp"
#include "OverbyteIcsHttpProt.hpp"
#include "OverbyteIcsSslBase.hpp"
#include "OverbyteIcsWndControl.hpp"

#include <memory>
#include <vector>

const unsigned WM_401REPEAT = WM_USER + 758;
const unsigned WM_WSMESS    = WM_USER + 759;

class THttpRestForm : public TForm
{
__published:
    TLabel *Label68;
    TLabel *Label79;
    TPageControl *PageControl1;
    TTabSheet *TabREST;
    TLabel *Label1;
    TLabel *Label3;
    TLabel *Label5;
    TLabel *Label33;
    TLabel *Label64;
    TLabel *LabelProgress;
    TLabel *Label65;
    TComboBox *RestURL;
    TStringGrid *GridParams;
    TRadioGroup *ParamContent;
    TRadioGroup *ReqMode;
    TEdit *RawParams;
    TRadioGroup *ReqType;
    TButton *doStartReq;
    TButton *doClear;
    TButton *doAbort;
    TButton *doClearParams;
    TCheckBox *ReqReplFile;
    TEdit *RestDownFile;
    TBitBtn *SelDirDown;
    TButton *doExit;
    TEdit *HttpUploadFile;
    TBitBtn *SelDirUpload;
    TRadioGroup *HttpUploadStrat;
    TCheckBox *FormDataUtf8;
    TCheckBox *SaveNonTextual;
    TRadioGroup *ParamJsonFmt;
    TTabSheet *TabSettings;
    TLabel *Label4;
    TLabel *Label22;
    TLabel *Label31;
    TLabel *Label32;
    TLabel *Label63;
    TLabel *Label9;
    TLabel *Label77;
    TLabel *Label78;
    TLabel *Label80;
    TRadioGroup *DebugLogging;
    TMemo *ExtraHeaders;
    TRadioGroup *IpSockFamily;
    TBitBtn *SelDirLogs;
    TEdit *DirLogs;
    TEdit *ProxyURL;
    TEdit *AlpnProtos;
    TButton *doListCertStore;
    TComboBox *ReqAccept;
    TEdit *SyncReqTimeout;
    TEdit *SyncReqMaxSecs;
    TRadioGroup *CacheControl;
    TEdit *CacheSeconds;
    TCheckBox *GzipCompress;
    TCheckBox *FollowRelocations;
    TEdit *UserAgent;
    TRadioGroup *ReqMemStrategy;
    TGroupBox *GroupBox7;
    TRadioGroup *ReqPropFind;
    TCheckBox *ReqGetRaw;
    TCheckBox *ReqPFindSome;
    TTabSheet *TabRestAuth;
    TRadioGroup *AuthType;
    TGroupBox *GroupBox5;
    TLabel *Label8;
    TLabel *Label7;
    TLabel *Label6;
    TEdit *AuthBearer;
    TEdit *AuthPassword;
    TEdit *AuthLogin;
    TGroupBox *GroupBox6;
    TTabSheet *TabSSL;
    TGroupBox *BoxClientCert;
    TComboBox *SslClientCertLoc;
    TEdit *SslClientCertFile;
    TRadioGroup *SslSecurity;
    TRadioGroup *CertVerMethod;
    TCheckBox *CertRevoke;
    TCheckBox *ReportCertChain;
    TCheckBox *NoSSL;
    TRadioGroup *SslSniType;
    TGroupBox *GroupBox1;
    TLabel *Label2;
    TLabel *Label84;
    TLabel *Label85;
    TEdit *SslCipherEdit;
    TEdit *SslCipher13Edit;
    TEdit *SslGroupsEdit;
    TTabSheet *TabOAuth;
    TLabel *Label19;
    TLabel *Label20;
    TLabel *Label69;
    TGroupBox *GroupBoxOAuth;
    TLabel *Label10;
    TLabel *Label11;
    TLabel *Label12;
    TLabel *Label13;
    TLabel *Label14;
    TLabel *Label21;
    TLabel *Label34;
    TLabel *Label54;
    TLabel *Label55;
    TLabel *Label66;
    TLabel *Label70;
    TEdit *OAuthAppUrl;
    TEdit *OAuthClientId;
    TEdit *OAuthClientSecret;
    TEdit *OAuthRedirectUrl;
    TEdit *OAuthTokenUrl;
    TEdit *OAuthScope;
    TCheckBox *OAuthOptNoRedir;
    TEdit *OAuthPrompt;
    TCheckBox *OAuthAccess;
    TComboBox *OAuthAccTitle;
    TEdit *OAuthConsoleUrl;
    TComboBox *OAuthUserAuth;
    TEdit *OAuthLoginHint;
    TCheckBox *OAuthOptBasic;
    TCheckBox *OAuthOptNoSecret;
    TGroupBox *GroupBox2;
    TLabel *Label15;
    TLabel *Label16;
    TLabel *Label17;
    TLabel *Label18;
    TLabel *LabelResult;
    TEdit *OAuthAuthCode;
    TEdit *OAuthAccToken;
    TEdit *OAuthRefToken;
    TEdit *OAuthExpire;
    TCheckBox *OAuthAutoRefresh;
    TEdit *OAuthRefrMins;
    TRadioGroup *OAuthAuthType;
    TComboBox *OAuthWebIP;
    TEdit *OAuthWebPort;
    TButton *doOAuthLogin;
    TButton *doOAuthToken;
    TButton *doOAuthRefresh;
    TButton *doTestRedir;
    TButton *doGrantCred;
    TButton *doGrantPassword;
    TButton *doOAuthConsole;
    TEdit *OAuthEdgeCache;
    TTabSheet *TabDNSHTTPS;
    TLabel *Label23;
    TLabel *Label222;
    TLabel *Label25;
    TComboBox *DnsHttpsUrl;
    TComboBox *DnsDomainName;
    TComboBox *DnsQueryType;
    TButton *doDNSJson;
    TCheckBox *DnsDnssec;
    TCheckBox *DnsNoValidation;
    TButton *doDnsQuery1;
    TButton *doDnsQueryAll;
    TButton *doDnsQueryBothA;
    TTabSheet *TabTwitter;
    TLabel *Label37;
    TLabel *Label42;
    TLabel *Label43;
    TGroupBox *BoxTritterSettings;
    TLabel *Label36;
    TLabel *Label38;
    TLabel *Label39;
    TLabel *Label40;
    TLabel *Label35;
    TLabel *Label41;
    TLabel *TwitResultLabel;
    TEdit *TwitApiSecret;
    TEdit *TwitAccToken;
    TEdit *TwitAccSecret;
    TEdit *TwitApiKey;
    TCheckBox *TwitForceLogin;
    TEdit *TwitScrnName;
    TEdit *TwitScrnId;
    TRadioGroup *TwitAuthType;
    TButton *doTwitLogin;
    TMemo *TwitMsg;
    TButton *doTwitMsg;
    TEdit *TwitQuery;
    TEdit *TwitIdList;
    TButton *doTwitAccSett;
    TButton *doTwitQuery;
    TButton *doTwitGetId;
    TTabSheet *TabSms;
    TGroupBox *BoxSmsMsg;
    TLabel *Label26;
    TLabel *Label28;
    TLabel *Label29;
    TEdit *SmsAccSender;
    TMemo *SmsMsgText;
    TMemo *SmsDestNums;
    TGroupBox *GroupBox3;
    TLabel *Label24;
    TLabel *Label27;
    TLabel *LabelKapowCredit;
    TLabel *LabelKapowResult;
    TEdit *KapowAccPw;
    TEdit *KapowAccName;
    TButton *doKapowSend;
    TButton *doKapowCheck;
    TButton *doKapowCredit;
    TGroupBox *BoxSmsWorks;
    TLabel *Label30;
    TLabel *LabelSmsWorksCredits;
    TLabel *LabelSmsWorksResult;
    TButton *doSmsWorksSend;
    TButton *doSmsWorksCheck;
    TButton *doSmsWorksCredit;
    TEdit *SmsWorksJWT;
    TTabSheet *TabEmail;
    TLabel *Label56;
    TLabel *Label57;
    TLabel *Label58;
    TLabel *Label59;
    TLabel *Label60;
    TLabel *Label61;
    TLabel *LabelEmailResult;
    TLabel *Label62;
    TLabel *Label73;
    TMemo *EmailRecipList;
    TEdit *EmailFrom;
    TEdit *EmailCC;
    TEdit *EmailSubject;
    TButton *doEmailSend;
    TMemo *EmailMessage;
    TButton *doEmailList;
    TButton *doEmailRead;
    TListBox *EmailReadMessId;
    TButton *doEmailHdrs;
    TCheckBox *EmailRawHdrs;
    TButton *doEmailDelete;
    TListBox *EmailHdrFolder;
    TEdit *EmailFileAttach;
    TBitBtn *SelDirEmailFile;
    TTabSheet *TabEmailSet;
    TGroupBox *GroupBox4;
    TLabel *Label44;
    TLabel *Label45;
    TLabel *Label46;
    TLabel *Label47;
    TLabel *Label48;
    TLabel *Label49;
    TLabel *EmailOAResultLabel;
    TLabel *Label51;
    TLabel *Label52;
    TLabel *Label53;
    TLabel *Label50;
    TLabel *Label67;
    TEdit *EmailClientId;
    TEdit *EmailAccToken;
    TEdit *EmailRefrToken;
    TEdit *EmailAccount;
    TCheckBox *EmailForceLogin;
    TEdit *EmailTokenAccnt;
    TEdit *EmailAccExpiry;
    TComboBox *EmailRestType;
    TEdit *EmailClientSecret;
    TButton *doEmaiTstRedir;
    TButton *doEmailOALogin;
    TButton *doEmailOARefresh;
    TButton *doEmailOACons;
    TEdit *EmailAccountHint;
    TComboBox *EmailUserAuth;
    TRadioGroup *EmailAuthType;
    TTabSheet *TabInetAlive;
    TGroupBox *GroupBoxAlive;
    TLabel *LabelInetAlive;
    TRadioGroup *AliveMethod;
    TRadioGroup *AliveNets;
    TButton *doAliveStart;
    TButton *doAliveStop;
    TTabSheet *TabWebSocket;
    TGroupBox *BoxWebsocket;
    TLabel *Label71;
    TLabel *Label72;
    TLabel *LabelWSProgress;
    TLabel *Label74;
    TLabel *Label75;
    TLabel *LabelWsFrames;
    TLabel *Label76;
    TComboBox *WebSockUrl;
    TComboBox *WebsockMessage;
    TButton *doWSConnectAsync;
    TButton *doWSDisconnect;
    TButton *doWSSendText;
    TEdit *WebsocketPingSecs;
    TButton *doWSAbort;
    TButton *doWSSendBin;
    TButton *doWSSendLong;
    TCheckBox *WebsocketAllHeaders;
    TMemo *WebsockMessLines;
    TButton *doWSSendLines;
    TCheckBox *WebSocketMLineMReq;
    TButton *doWSConnectSync;
    TTabSheet *TabRawPubKeys;
    TMemo *LogWin;
    TListView *RespList;
    TSslHttpRest *HttpRest1;
    TRestOAuth *RestOAuth1;
    TOpenDialog *OpenDirDiag;
    TDnsQueryHttps *DnsQueryHttps1;
    TTimer *TimerLog;
    TIcsSMS *IcsSMS1;
    TSslHtmlSmtpCli *SslHtmlSmtpCli1;
    TIcsTwitter *IcsTwitter1;
    TIcsRestEmail *IcsRestEmail1;
    TIcsInetAlive *IcsInetAlive1;
    TOAuthBrowser *OAuthBrowser1;
    TSslWebSocketCli *SslWebSocketCli1;
    TSaveDialog *SaveDialog1;
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall FormShow(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
    void __fastcall GridParamsSelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect);
    void __fastcall doStartReqClick(TObject *Sender);
    void __fastcall doClearClick(TObject *Sender);
    void __fastcall doAbortClick(TObject *Sender);
    void __fastcall doClearParamsClick(TObject *Sender);
    void __fastcall SelDirDownClick(TObject *Sender);
    void __fastcall doExitClick(TObject *Sender);
    void __fastcall SelDirUploadClick(TObject *Sender);
    void __fastcall DebugLoggingClick(TObject *Sender);
    void __fastcall SelDirLogsClick(TObject *Sender);
    void __fastcall doListCertStoreClick(TObject *Sender);
    void __fastcall SettingsChange(TObject *Sender);
    void __fastcall OAuthAccTitleChange(TObject *Sender);
    void __fastcall doOAuthLoginClick(TObject *Sender);
    void __fastcall doOAuthTokenClick(TObject *Sender);
    void __fastcall doOAuthRefreshClick(TObject *Sender);
    void __fastcall doTestRedirClick(TObject *Sender);
    void __fastcall doGrantCredClick(TObject *Sender);
    void __fastcall doGrantPasswordClick(TObject *Sender);
    void __fastcall doOAuthConsoleClick(TObject *Sender);
    void __fastcall doDNSJsonClick(TObject *Sender);
    void __fastcall doDnsQuery1Click(TObject *Sender);
    void __fastcall doDnsQueryAllClick(TObject *Sender);
    void __fastcall doDnsQueryBothAClick(TObject *Sender);
    void __fastcall doTwitLoginClick(TObject *Sender);
    void __fastcall doTwitMsgClick(TObject *Sender);
    void __fastcall doTwitAccSettClick(TObject *Sender);
    void __fastcall doTwitQueryClick(TObject *Sender);
    void __fastcall doTwitGetIdClick(TObject *Sender);
    void __fastcall doKapowSendClick(TObject *Sender);
    void __fastcall doKapowCheckClick(TObject *Sender);
    void __fastcall doKapowCreditClick(TObject *Sender);
    void __fastcall doSmsWorksSendClick(TObject *Sender);
    void __fastcall doSmsWorksCheckClick(TObject *Sender);
    void __fastcall doSmsWorksCreditClick(TObject *Sender);
    void __fastcall doEmailSendClick(TObject *Sender);
    void __fastcall doEmailListClick(TObject *Sender);
    void __fastcall doEmailReadClick(TObject *Sender);
    void __fastcall doEmailHdrsClick(TObject *Sender);
    void __fastcall doEmailDeleteClick(TObject *Sender);
    void __fastcall SelDirEmailFileClick(TObject *Sender);
    void __fastcall doEmaiTstRedirClick(TObject *Sender);
    void __fastcall doEmailOALoginClick(TObject *Sender);
    void __fastcall doEmailOARefreshClick(TObject *Sender);
    void __fastcall doEmailOAConsClick(TObject *Sender);
    void __fastcall doAliveStartClick(TObject *Sender);
    void __fastcall doAliveStopClick(TObject *Sender);
    void __fastcall doWSConnectAsyncClick(TObject *Sender);
    void __fastcall doWSDisconnectClick(TObject *Sender);
    void __fastcall doWSSendTextClick(TObject *Sender);
    void __fastcall doWSAbortClick(TObject *Sender);
    void __fastcall doWSSendBinClick(TObject *Sender);
    void __fastcall doWSSendLongClick(TObject *Sender);
    void __fastcall doWSSendLinesClick(TObject *Sender);
    void __fastcall doWSConnectSyncClick(TObject *Sender);
    void __fastcall RespListDblClick(TObject *Sender);
    void __fastcall HttpRest1HttpRestProg(TObject *Sender, TLogOption LogOption, const String Msg);
    void __fastcall HttpRest1RestRequestDone(TObject *Sender, THttpRequest RqType, Word ErrCode);
    void __fastcall HttpRest1SslCertVerifyEvent(TObject *Sender, TX509List *CertChain, int &VerifyCode, String &VerifyInfo, bool &Disconnect);
    void __fastcall RestOAuth1OAuthEmbed(TObject *Sender, const String URL, bool &Success);
    void __fastcall RestOAuth1OAuthAuthUrl(TObject *Sender, const String URL);
    void __fastcall RestOAuth1OAuthProg(TObject *Sender, TLogOption LogOption, const String Msg);
    void __fastcall RestOAuth1OAuthNewCode(TObject *Sender);
    void __fastcall RestOAuth1OAuthNewToken(TObject *Sender);
    void __fastcall DnsQueryHttps1RequestDone(TObject *Sender, Word Error);
    void __fastcall DnsQueryHttps1DnsProg(TObject *Sender, TLogOption LogOption, const String Msg);
    void __fastcall TimerLogTimer(TObject *Sender);
    void __fastcall IcsSMS1SmsProg(TObject *Sender, TLogOption LogOption, const String Msg);
    void __fastcall IcsSMS1SmsDone(TObject *Sender);
    void __fastcall SslHtmlSmtpCli1BeforeOutStreamFree(TObject *Sender);
    void __fastcall IcsTwitter1TwitNewToken(TObject *Sender);
    void __fastcall IcsTwitter1TwitEmbed(TObject *Sender, const String URL, bool &Success);
    void __fastcall IcsRestEmail1EmailNewToken(TObject *Sender);
    void __fastcall IcsRestEmail1OAEmbed(TObject *Sender, const String URL, bool &Success);
    void __fastcall IcsInetAlive1AliveChange(TObject *Sender);
    void __fastcall SslWebSocketCli1HttpRestProg(TObject *Sender, TLogOption LogOption, const String Msg);
    void __fastcall SslWebSocketCli1RestRequestDone(TObject *Sender, THttpRequest RqType, Word ErrCode);
    void __fastcall SslWebSocketCli1WSConnected(TObject *Sender);
    void __fastcall SslWebSocketCli1WSDisconnected(TObject *Sender);
    void __fastcall SslWebSocketCli1WSFrameRcvd(TSslWebSocketCli *Sender, const String APacket, TWebSocketReceivedFrame *&AFrame);
    void __fastcall SslWebSocketCli1WSFrameSent(TSslWebSocketCli *Sender, TWebSocketOutgoingFrame *&AFrame);
    void __fastcall SslWebSocketCli1WSFramesDone(TObject *Sender);

protected:
    void __fastcall WM401Repeat(TMessage &Msg);
    void __fastcall WMWsMess(TMessage &Msg);

    BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_401REPEAT, TMessage, WM401Repeat)
        VCL_MESSAGE_HANDLER(WM_WSMESS, TMessage, WMWsMess)
    END_MESSAGE_MAP(TForm)

private:
    String FIniFileName;
    String FCookieFileName;
    bool FInitialized = false;
    std::unique_ptr<TIcsBuffLogStream> FIcsBuffLogStream;
    String FBuffLogLines;
    String FKapowSentId;
    String FSmsWorksSentId;
    String FSmtpRawMsg;
    String FLastRawParams;
    std::vector<TOAuthUri> FOAuthUris;
    std::vector<String> FJArrayItems;
    int FWsLineNext = 0;
    int FWsLineTot = 0;

    THttpDebugLevel SelectedDebugLevel();
    void LoadSettings();
    void SaveSettings();
    void FlushLog();
    void OpenLogFile();
    void ClearRespList();
    bool LoadClientCert(TX509Base *SslCliCert);
    bool LoadClientCertFromStore(TX509Base *SslCliCert);
    bool CommonRestSettings();
    bool CommonWsSettings();
    void SetWsButtons(bool Online);
    void MyWSConnect(bool Async);
    void RestOAuthSetup();
    void SetupDnsQuery();
    void TwitSetup();
    void EmailSetup();
    void SetupSms(TSmsProvider Provider);
    void LogTwitterJson();

public:
    __fastcall THttpRestForm(TComponent *Owner);
    void AddLog(const String &S);
    void DisplayJson(_di_ISuperObject RespObj);
};

extern PACKAGE THttpRestForm *HttpRestForm;

#endif
