unit uDataModuleUsuarios;

interface

uses {vcl:} SysUtils, Classes, DB, DBClient,
     {RemObjects:} uDAClientDataModule, uDADataTable, uDABINAdapter,
  uROServiceComponent, uRORemoteService, uROClient, uROBinMessage,
  uROWinInetHttpChannel, uDAScriptingProvider, uDACDSDataTable,
  FactuGES_Intf, uIntegerListUtils, uBizEmpresas;

const
  PERFIL_ADMINISTRADORES = 'Administradores';

type
  TdmUsuarios = class(TDAClientDataModule)
    ROLoginService: TRORemoteService;
    DABINAdapter: TDABINAdapter;
    procedure DAClientDataModuleCreate(Sender: TObject);
    procedure DAClientDataModuleDestroy(Sender: TObject);
  private
    FUsuario : String;
    FPassword : String;   // Lo guardo para poder hacer una reconexión

    FLoginInfo: TRdxLoginInfo;
    FEmpresaActual: IBizEmpresa;
    function CambiarPassword (const APassword : String) : boolean; overload;
    function GetEsAdministrador: Boolean;

    function GetEmpresas: TIntegerList;

    procedure SetEmpresaActual(const Value: IBizEmpresa);
    function GetIDEmpresaActual: Integer;
    procedure SetIDEmpresaActual(const Value: Integer);
  public
    function Login: Boolean; overload;
    function Login(Usuario: String; Password: String): Boolean; overload;
    procedure Logout;
    procedure CambiarPassword; overload;
    property EsAdministrador : Boolean read GetEsAdministrador;
    property IDEmpresaActual : Integer read GetIDEmpresaActual write SetIDEmpresaActual;
    property EmpresaActual : IBizEmpresa read FEmpresaActual write SetEmpresaActual;
    property Empresas : TIntegerList read GetEmpresas;
    property LoginInfo: TRdxLoginInfo read FLoginInfo;
  end;

var
  dmUsuarios: TdmUsuarios;

implementation

{$R *.DFM}

uses
  Forms, Controls, uDataTableUtils, uDataModuleConexion, uLoginForm,
  uCambiarPassword, Dialogs, Windows, uEmpresasController;

{ TDAClientDataModule1 }

procedure TdmUsuarios.DAClientDataModuleCreate(Sender: TObject);
begin
  ROLoginService.Channel := dmConexion.Channel;
  ROLoginService.Message := dmConexion.Message;
  FEmpresaActual := nil;
  FUsuario := '';
  FPassword := '';
  FLoginInfo := NIL;
end;

function TdmUsuarios.Login: Boolean;
begin
  // Intento hacer login si el usuario ya lo había hecho antes
  if (Length(FUsuario) > 0) then
    if Login(FUsuario, FPassword) then
      Exit;

  // Si no funcionar el login anterior o es la primera vez,
  // saco la pantalla de login
  with TfLoginForm.Create(NIL) do
    try
      if Assigned(FLoginInfo) then
        edtUser.Text := FLoginInfo.Usuario;
      Result := (ShowModal = mrOK)
    finally
      Free;
    end;
end;

function TdmUsuarios.Login(Usuario: String; Password: String): Boolean;
begin
  // Libero la información del login anterior (sesión, etc)
  if Assigned(FLoginInfo) then
    FreeANDNil(FLoginInfo);

  Result := (ROLoginService as IsrvLogin).Login(Usuario, Password, FLoginInfo);

  if Result  then
  begin
    // Lo guardo para poder reconectarme
    FUsuario := Usuario;
    FPassword := Password;
  end;
end;

procedure TdmUsuarios.Logout;
begin
  (ROLoginService as IsrvLogin).Logout;
  if Assigned(FLoginInfo) then
    FreeANDNil(FLoginInfo);
  FUsuario := '';
  FPassword := '';
end;

procedure TdmUsuarios.SetEmpresaActual(const Value: IBizEmpresa);
begin
  FEmpresaActual := Value;
  FEmpresaActual.DataTable.Active := True;
end;

procedure TdmUsuarios.SetIDEmpresaActual(const Value: Integer);
var
  AEmpresasController : IEmpresasController;
  AEmpresa : IBizEmpresa;
begin
  AEmpresasController := TEmpresasController.Create;
  AEmpresa := AEmpresasController.Buscar(Value);
  AEmpresa.DataTable.Active := True;
  
  if not AEmpresa.IsEmpty then
  begin
    FEmpresaActual := AEmpresa;
    FEmpresaActual.DataTable.Active := True;
  end
  else
    FEmpresaActual := NIL;
end;

procedure TdmUsuarios.DAClientDataModuleDestroy(Sender: TObject);
begin
  if Assigned(FLoginInfo) then
    FreeANDNil(FLoginInfo);
end;

function TdmUsuarios.GetEmpresas: TIntegerList;
var
  i : integer;
begin
  Result := TIntegerList.Create;

  if not Assigned(FLoginInfo) then
    raise Exception.Create('Usuario no validado en el sistema (login)');

  for i := 0 to FLoginInfo.Empresas.Count - 1 do
    Result.Add(FLoginInfo.Empresas.Items[i]);
end;

function TdmUsuarios.GetEsAdministrador: Boolean;
var
  I: Integer;
begin
  Result := False;

  if not Assigned(FLoginInfo) then
    raise Exception.Create('Usuario no validado en el sistema (login)');

  for I := 0 to FLoginInfo.Perfiles.Count - 1 do
    if FLoginInfo.Perfiles.Items[I] = PERFIL_ADMINISTRADORES then
    begin
      Result := True;
      Break;
    end;
end;

function TdmUsuarios.GetIDEmpresaActual: Integer;
begin
  if not Assigned(FEmpresaActual) then
    Result := ID_NULO
  else
    Result := FEmpresaActual.ID;
end;

procedure TdmUsuarios.CambiarPassword;
begin
  with TfCambiarPassword.Create(NIL) do
    try
      if ShowModal = mrOk then
        if CambiarPassword(edtPassword.Text) then
          Application.MessageBox('La contraseña ha sido cambiada correctamente.', 'Información', MB_OK);
    finally
      Free;
    end;
end;

function TdmUsuarios.CambiarPassword(const APassword: String): boolean;
begin
{  if not (ROLoginService as IsrvLogin).SetUserPassword(LoginInfo.UserID, APassword) then
    raise Exception.Create('Error en el servidor. No se ha podido cambiar la contraseña');}
  Result := True;
end;

initialization
  dmUsuarios := TdmUsuarios.Create(nil);

finalization
  FreeAndNil(dmUsuarios);

end.
