unit UMensagensEnviar;

interface

uses
  System.Classes, System.NetEncoding, System.SysUtils,  System.JSON,

  Vcl.Forms,  Vcl.Dialogs,

  FireDAC.Stan.Param, FireDAC.Comp.Client

  ,uTInject

  ,uConexao
  ,uDmMain, Data.DB
  ;

const MENSAGEM_VOLTAR_INICIO = '\n\nPara retornar ao menu inicial digite *Início*';
const MENSAGEM_TEMPO_PEDIDO = '\n\n*Importante*: Você tem um tempo de %s 5 minutos para finalizar seu pedido.'+
                              ' Caso ultrapasse esse tempo, seu pedido será *cancelado* automaticamente.';

const MENSAGEM_NAO_CADASTRADA = '\n\n *Desculpe mas não foi encontrado nenhuma mensagem!* \n\n' +
                                'Entre em contato com o Administrador do Sistema para mais Informações!';


  procedure EnviarMsgWhatsApp(AInject: TInject; Numero: string;  ATexto: String; AAnexo: String = '');

  procedure OutMsgBanco(AInject: TInject; Numero: string;  TipoMsg:  string = 'menu_principal';  MsgId: Integer = 1); overload
  procedure OutMsgBanco(AInject: TInject; Numero: string;  TipoMsg:  string;  MsgTxt: string); overload;

  procedure EmviarMsgWhatsAppBanco(AInject: TInject; Numero: string;  TipoMsg:  string = 'menu_principal';  MsgId: Integer = 1);  overload;
  procedure EmviarMsgWhatsAppBanco(AInject: TInject; Numero: string;  TipoMsg:  string;  MsgTxt: string);  overload;

  procedure EmviarMsgWhatsAppBancoNewConversa(AInject: TInject; Numero: string;  TipoMsg:  string;  MsgTxt: string);

  function VerIfMsgBanco(TipoMsg:  string = 'resposta';  MsgId: Integer = 0)  : Boolean;  overload;
  function VerIfMsgBanco(TipoMsg:  string;  MsgTxt: string)  : Boolean;  overload;



implementation

{---------Funções Auxiliares----------------}
{
procedure GerarMensWhatsApp( PArquivoPath: String): TMemoryStream;
var
  vArquivo: TMemoryStream;
begin
  vArquivo:= TMemoryStream.Create;
  result:= False;
  if not FileExists(PArquivoPath) then
    exit;
  try
    vArquivo.Position:= 0;
    vArquivo.LoadFromFile(PArquivoPath);
    result:=
  except
    raise;
  end;
end;  }

function SaudacaoPorHora: string;
var
  HoraAtual:ttime;
begin
  HoraAtual:=StrToTIme(TimeToStr(Time));

  If TimeToStr(HoraAtual) >=  '00:00:00' Then
    Result  :=  '.      ..:: *Bom Dia* ::..          .';

  If TimeToStr(HoraAtual) >= '12:00:00' Then
    Result  :=  '.       ..:: *Boa Tarde* ::..       .';

  If TimeToStr(HoraAtual) >=  '18:00:00' Then
    Result  :=  '.       ..:: *Boa Noite* ::..       .';
end;
{--------==========================-----------------}

procedure EnviarMsgWhatsApp(AInject: TInject;  Numero: string;  ATexto: String; AAnexo: String = '');
begin
  if AAnexo <> '' then
  begin
    AInject.SendFile(Numero, AAnexo, ATexto);
    //AInject.SendBase64('data:image/jpg;base64,'+AAnexo, Numero, 'file', ATexto);
  end
  else if ATexto <> '' then
  begin
    AInject.send(Numero, ATexto);
  end;
end;

//procedure SelectConversa(aConversaAtual: TBotConversa);
//begin
//  conversaAtual :=  aConversaAtual;
//end;

procedure OutMsgBanco(AInject: TInject; Numero, TipoMsg: string; MsgId: Integer);
var
  rFdq  : TFDQuery;
  rMsg  : string;
  vStream: TMemoryStream;
  ABase64: TStringList;
  LOutput: TMemoryStream;
begin
  rFdq    := TFDQuery.Create(nil);
  ABase64 := TStringList.Create;
  LOutput := TMemoryStream.Create;
  vStream := TMemoryStream.Create;
  try
    rFdq.Connection :=  DmMain.FDCon;
    try
      with rFdq do
      begin
        close;
        sql.Clear;
        sql.Add('select * from tbmsgwhatsapp'+
                ' where msg_tipo = :msg_tipo and msg_id_menu = :msg_id_menu');
        params.ParamByName('msg_tipo').Value    := TipoMsg;
        params.ParamByName('msg_id_menu').Value      := MsgId;
        open;
        if IsEmpty = false then
        begin
          First;
          TBlobField(FieldByName('msg_anexo')).SaveToStream(vStream);
          vStream.Position := 0;
          TNetEncoding.Base64.Encode( vStream, LOutput );
          LOutput.Position := 0;
          ABase64.LoadFromStream(LOutput);
          rMsg  :=  FieldByName('msg_texto').AsString;
          EnviarMsgWhatsApp(AInject,  Numero, rMsg, ABase64.Text);
        end
        else
        begin
          EnviarMsgWhatsApp(AInject,  Numero, MENSAGEM_NAO_CADASTRADA, '');
        end;
      end;
    except on E: Exception do
      ShowMessage('Erro ao Recuperar Mensagen de '  + TipoMsg  + #13 + e.Message);
    end;
  finally
    rFdq.Close;
    rFdq.Free;
  end;
end;

procedure OutMsgBanco(AInject: TInject; Numero,  TipoMsg,  MsgTxt: string);
var
  rFdq  : TFDQuery;
  rMsg  : string;
  vStream: TMemoryStream;
  ABase64: TStringList;
  LOutput: TMemoryStream;
begin
  rFdq    := TFDQuery.Create(nil);
  ABase64 := TStringList.Create;
  LOutput := TMemoryStream.Create;
  vStream := TMemoryStream.Create;
  try
    rFdq.Connection :=  DmMain.FDCon;
    try
      with rFdq do
      begin
        close;
        sql.Clear;
        sql.Add('select * from tbmsgwhatsapp'+
                ' where msg_tipo = :msg_tipo and msg_id_menu = :msg_id_menu');
        params.ParamByName('msg_tipo').Value    := TipoMsg;
        params.ParamByName('msg_id_menu').Value := MsgTxt;
        open;

        if IsEmpty = false then
        begin
          First;
          TBlobField(FieldByName('msg_anexo')).SaveToStream(vStream);
          vStream.Position := 0;
          TNetEncoding.Base64.Encode( vStream, LOutput );
          LOutput.Position := 0;
          ABase64.LoadFromStream(LOutput);

          rMsg  :=  FieldByName('msg_texto').AsString;

          EnviarMsgWhatsApp(AInject,  Numero, rMsg, ABase64.Text);
        end
        else
        begin
          EnviarMsgWhatsApp(AInject,  Numero, MENSAGEM_NAO_CADASTRADA, '');
        end;
      end;
    except
      on E: Exception do
      begin
        ShowMessage('Erro ao Recuperar Mensagen de '  + TipoMsg  + #13 + e.Message);
      end;
    end;
  finally
    rFdq.Close;
    rFdq.Free;
  end;
end;


function VerIfMsgBanco(TipoMsg: string; MsgId: Integer): Boolean;
var
  rFdq  : TFDQuery;
begin
  Result  :=  False;
  rFdq    := TFDQuery.Create(nil);
  try
    rFdq.Connection :=  DmMain.FDCon;
    try
      with rFdq do
      begin
        close;
        sql.Clear;
        sql.Add('select * from tbmsgwhatsapp'+
                ' where msg_tipo = :msg_tipo and msg_id_menu = :msg_id_menu');
        params.ParamByName('msg_tipo').Value    := TipoMsg;
        params.ParamByName('msg_id_menu').Value      := MsgId;
        open;

        if IsEmpty = false then
        begin
          Result  :=  True;
        end
        else
        begin
          Result  :=  False;
        end;

      end;
    except on E: Exception do
      ShowMessage('Erro ao Recuperar Mensagen de '  + TipoMsg  + #13 + e.Message);
    end;
  finally
    rFdq.Close;
    rFdq.Free;
  end;
end;

function VerIfMsgBanco(TipoMsg, MsgTxt: string): Boolean;
var
  rFdq  : TFDQuery;
begin
  Result  :=  False;
  rFdq    := TFDQuery.Create(nil);
  try
    rFdq.Connection :=  DmMain.FDCon;
    try
      with rFdq do
      begin
        close;
        sql.Clear;
        sql.Add('select * from tbmsgwhatsapp'+
                ' where msg_tipo = :msg_tipo and msg_id_menu = :msg_id_menu');
        params.ParamByName('msg_tipo').Value      := TipoMsg;
        params.ParamByName('msg_id_menu').Value   := MsgTxt;
        open;

        if IsEmpty = false then
        begin
          Result  :=  True;
        end
        else
        begin
          Result  :=  False;
        end;
      end;

    except
      on E: Exception do
      begin
        ShowMessage('Erro ao Recuperar Mensagen de '  + TipoMsg  + #13 + e.Message);
      end;
    end;
  finally
    rFdq.Close;
    rFdq.Free;
  end;
end;


procedure EmviarMsgWhatsAppBanco(AInject: TInject; Numero,
  TipoMsg: string; MsgId: Integer);
begin
  if VerIfMsgBanco(TipoMsg, MsgId) then
    begin
      OutMsgBanco(AInject,  Numero, TipoMsg,  MsgId);
    end
  else
    begin
      OutMsgBanco(AInject,  Numero, 'resposta_invalida',  2);
    end;
end;

procedure EmviarMsgWhatsAppBanco(AInject: TInject; Numero,
  TipoMsg:  string;  MsgTxt: string);
begin
  if VerIfMsgBanco(TipoMsg, MsgTxt) then
    begin
      OutMsgBanco(AInject,  Numero, TipoMsg,  MsgTxt);
      if upperCase(MsgTxt) = '#FINALIZAR' then
        begin
//          conversaAtual.Situacao := saFinalizada;
        end
    end
  else
    begin
      OutMsgBanco(AInject,  Numero, 'resposta_invalida',  2);
    end;
end;

procedure EmviarMsgWhatsAppBancoNewConversa(AInject: TInject; Numero: string;  TipoMsg:  string;  MsgTxt: string);
begin
  if VerIfMsgBanco(TipoMsg, MsgTxt) then
    begin
      OutMsgBanco(AInject,  Numero, TipoMsg,  MsgTxt);
//      conversaAtual.Situacao := saEmAtendimento;
    end
  else
    begin
//      conversaAtual.Situacao  :=  saFinalizada;
    end;
end;


end.
