unit uAppState;

interface

uses
  System.SysUtils, System.Classes, System.Generics.Collections, VCL.ExtCtrls;

type
  TCICAppStateComponent = record
    name: String;
    loaded: Boolean;
    objecttype: String;
    class operator Initialize(out Dest: TCICAppStateComponent);
  end;
  TCICAppStateComponents = TList<TCICAppStateComponent>;
  TCICAppStateOnTimer = procedure() of object;
  TCICAppStateOnAppLoaded = procedure() of object;
  TCICAppState = class
  protected
    FTimer: TTimer;
    FTimerEvent: TCICAppStateOnTimer;
    FIsAppLoaded: Boolean;
    FAppStateComponents: TList<TCICAppStateComponent>;
    FAppLoadedEvent: TCICAppStateOnAppLoaded;
    procedure OnTimerTick(Sender : TObject);
    function IsAppLoaded(): Boolean;
  private
  public
    constructor Create(); overload;
    destructor Destroy(); overload;
    procedure AddAppStateComponent(const pASC: TCICAppStateComponent);
  published
    property AppLoaded: Boolean read FIsAppLoaded;
    property AppStateComponents: TCICAppStateComponents read FAppStateComponents;
    property OnTimer: TCICAppStateOnTimer read FTimerEvent write FTimerEvent;
    property OnAppLoaded: TCICAppStateOnAppLoaded read FAppLoadedEvent write FAppLoadedEvent;
  end;

//var


implementation

class operator TCICAppStateComponent.Initialize(out Dest: TCICAppStateComponent);
begin
  Dest.loaded := False;
end;

{ TCICAppState }

constructor TCICAppState.Create;
begin
  inherited Create;

  FAppStateComponents := TCICAppStateComponents.Create;

  FTimer := TTimer.Create(nil);
  FTimer.Enabled := False;
end;

destructor TCICAppState.Destroy;
begin
  FTimer.Enabled := False;
  FTimer.Free;

  FAppStateComponents.Free;

  inherited Destroy;
end;

procedure TCICAppState.AddAppStateComponent(const pASC: TCICAppStateComponent);
begin
  if ((pASC.name <> '') AND (pASC.objecttype <> '')) then
  begin
    FAppStateComponents.Add(pASC);
  end;
end;

function TCICAppState.IsAppLoaded: Boolean;
begin

  //FIsAppLoaded;
end;

procedure TCICAppState.OnTimerTick(Sender: TObject);
begin
  // ALE 20210114 regular check to update state and raise event for consumer

end;

end.
