unit uBaseEditoresFichas;

  {$MODE Delphi}

interface

uses
  SysUtils, Classes, Controls, Forms, Dialogs,
  uCosaConNombre, ufichasLPD, utilidades, StdCtrls, ExtCtrls, Grids, Buttons,
  ufechas,
  usalasdejuego, uBaseFormularios,
  xMatDefs, uBaseEditores;

resourcestring
  rsCiclosActiva = 'Ciclos Activa';
  rsCiclosInactiva = 'Ciclos Inactiva';
  rsDesplazamiento = 'Desplazamiento';
  mesValorIntroducidoDebeNumYMayor0 =
    'El valor ingresado debe ser numérico y mayor Que 0';
  rs_Anios = 'Años';
  rs_Meses = 'Meses';
  rs_Semanas = 'Semanas';
  rs_Dias = 'Días';

type

  { TBaseEditoresFichas }

  TBaseEditoresFichas = class(TBaseEditores)
  published
    CBLargoPeriodo: TComboBox;
    CBPeriodicidad: TCheckBox;
    eFIni: TEdit;
    EFFinPeriodo: TEdit;
    EFIniPeriodo: TEdit;
    ELargoPeriodo: TEdit;
    LFIni: TLabel;
    LFinPeriodo: TLabel;
    LIniPeriodo: TLabel;
    LLargoPeriodo: TLabel;
    panelPeriodicidad: TPanel;
    PPeriodicidad: TPanel;
    sgPeriodicidad: TStringGrid;
    procedure CBLargoPeriodoChange(Sender: TObject);
    procedure CBPeriodicidadChange(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure panelPeriodicidadClick(Sender: TObject);
    procedure sgPeriodicidadValidarCambio(tabla: TStringGrid);
    procedure sgPeriodicidadKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
  protected


    function darPeriodicidad(CBLargo: TComboBox; ELPer, EFIni, EFFin: Tedit;
      integers: TStringGrid): TPeriodicidad;
    procedure llenarCamposPeriodicidad(ficha: TFichaLPD);
    function validarTablaPeriodicidad(sg: TStringGrid): boolean;
    function validarPeriodicidad(CBperiodicidad: Tcheckbox;
      CBLargo: TComboBox; ELPer, EFIni, EFFin: Tedit; integers: TStringGrid): boolean;
  private

  public

    ficha: TFichaLPD;

    constructor Create(AOwner: TComponent; nombreCosa: string;
      claseCosa: TClaseDeCosaConNombre; ficha: TFichaLPD; sala: TSalaDeJuego);
      reintroduce; overload; virtual;
    constructor Create(AOwner: TComponent; cosaConNombre: TCosaConNombre;
      ficha: TFichaLPD; sala: TSalaDeJuego); reintroduce; overload; virtual;
    function darFicha(): TFichaLPD;
    procedure Free;
  end;

  TClaseEditoresFichas = class of TBaseEditoresFichas;

implementation

uses SimSEEEditMain;

  {$R *.lfm}

constructor TBaseEditoresFichas.Create(AOwner: TComponent; nombreCosa: string;
  claseCosa: TClaseDeCosaConNombre; ficha: TFichaLPD; sala: TSalaDeJuego);
begin
  inherited Create(AOwner, ficha, sala);
  self.Top := TForm(Owner).Top + plusTop;
  self.Left := TForm(Owner).Left + plusLeft;
  if ficha = nil then
  begin
    self.Caption := 'Agregar ficha de "' + nombreCosa + '" ' + claseCosa.DescClase;
  end
  else
  begin
    self.Caption := 'Editar ficha de "' + nombreCosa + '" ' + claseCosa.DescClase;
  end;
  guardado := True;
  llenarCamposPeriodicidad(ficha);
end;

constructor TBaseEditoresFichas.Create(AOwner: TComponent;
  cosaConNombre: TCosaConNombre; ficha: TFichaLPD; sala: TSalaDeJuego);
begin
  inherited Create(AOwner, ficha, sala);
  self.Top := TForm(Owner).Top + plusTop;
  self.Left := TForm(Owner).Left + plusLeft;


  sgPeriodicidad.Cells[1, 0] := '1'; //ciclosOn
  sgPeriodicidad.Cells[1, 1] := '0'; //ciclosOff
  sgPeriodicidad.Cells[1, 2] := '0'; //ciclosOffset


  if cosaConNombre <> nil then
  begin
    if ficha = nil then
    begin
      self.Caption := 'Agregar ficha de "' + cosaConNombre.nombre +
        '" ' + cosaConNombre.DescClase;
    end
    else
    begin
      self.Caption := 'Editar ficha de  "' + cosaConNombre.nombre +
        '" ' + cosaConNombre.DescClase;
    end;
  end;
  //TODO pasar claseCosa
  guardado := True;

  llenarCamposPeriodicidad(ficha);

end;


function TBaseEditoresFichas.darFicha(): TFichaLPD;
begin
  Result := ficha;
end;

function TBaseEditoresFichas.darPeriodicidad(CBLargo: TComboBox;
  ELPer, EFIni, EFFin: Tedit; integers: TStringGrid): TPeriodicidad;
var
  cant: NReal;
  tipo: TTipoPeriodicidad;
begin
  cant := StrToInt(ELPer.Text);
  case CBLargo.ItemIndex of
    0: // if CBLargo.Items[CBLargo.ItemIndex] = 'Años' then
    begin
      tipo := TP_Anual;
      cant := aniosTohoras(cant);
    end;
    1: // else if CBLargo.Items[CBLargo.ItemIndex] = 'Meses' then
    begin
      tipo := TP_Mensual;
      cant := mesesToHoras(cant);
    end;
    2://  else if CBLargo.Items[CBLargo.ItemIndex] = 'Semanas' then
    begin
      tipo := TP_Semanal;
      cant := semanasToHoras(cant);
    end;
    else
    begin
      tipo := TP_Diaria;
      cant := diasToHoras(cant);
    end;
  end;

  Result := TPeriodicidad.Create(StrToFecha(EFIni.Text),
    StrToFecha(EFFin.Text), cant, StrToInt(integers.Cells[1, 0]),
    StrToInt(integers.Cells[1, 1]), StrToFloat(integers.Cells[1, 2]), tipo);
end;

procedure TBaseEditoresFichas.llenarCamposPeriodicidad(ficha: TFichaLPD);
var
  cant: integer;
begin
  CBLargoPeriodo.Items.Clear;
  CBLargoPeriodo.Items.add(rs_Anios);
  CBLargoPeriodo.Items.add(rs_Meses);
  CBLargoPeriodo.Items.add(rs_Semanas);
  CBLargoPeriodo.Items.add(rs_Dias);

  PPeriodicidad.Enabled := False;
  sgPeriodicidad.Cells[0, 0] := rsCiclosActiva;
  sgPeriodicidad.Cells[0, 1] := rsCiclosInactiva;
  sgPeriodicidad.Cells[0, 2] := rsDesplazamiento;
  utilidades.AutoSizeCol(sgPeriodicidad, 0);

  sgPeriodicidad.Options := sgPeriodicidad.Options + [goEditing];
  CBLargoPeriodo.ItemIndex := 0;
  if (ficha <> nil) and (ficha.periodicidad <> nil) then
  begin
    CBPeriodicidad.Checked := True;
    case ficha.periodicidad.tipoPeriodicidad_ of
      TP_Anual:
      begin
        CBLargoPeriodo.ItemIndex := 0;
        cant := round(horasToAnios(ficha.periodicidad.durPeriodoEnHoras));
      end;
      TP_Mensual:
      begin
        CBLargoPeriodo.ItemIndex := 1;
        cant := round(horasToMeses(ficha.periodicidad.durPeriodoEnHoras));
      end;
      TP_Semanal:
      begin
        CBLargoPeriodo.ItemIndex := 2;
        cant := round(horasToSemanas(ficha.periodicidad.durPeriodoEnHoras));
      end;
      TP_Diaria:
      begin
        CBLargoPeriodo.ItemIndex := 3;
        cant := round(horasToDias(ficha.periodicidad.durPeriodoEnHoras));
      end;
      else
        cant := -1;
    end;

    ELargoPeriodo.Text := IntToStr(cant);

    sgPeriodicidad.Cells[1, 0] := IntToStr(ficha.periodicidad.ciclosOn);
    sgPeriodicidad.Cells[1, 1] := IntToStr(ficha.periodicidad.ciclosOff);
    sgPeriodicidad.Cells[1, 2] := FloatToStr(ficha.periodicidad.ciclosOffset);

    EFIniPeriodo.Text := ficha.periodicidad.iniHorizonte.AsStr;
    EFFinPeriodo.Text := ficha.periodicidad.finHorizonte.AsStr;
  end;
  PPeriodicidad.Width := self.Canvas.TextWidth('Inicio de la Ventana:') +
    EFIniPeriodo.Width + sgPeriodicidad.Width + utilidades.plusWidth;

  CBPeriodicidadChange(Self);
end;


function TBaseEditoresFichas.validarTablaPeriodicidad(sg: TStringGrid): boolean;
var
  i, pos, val: integer;
begin
  pos := -1;
  try
    for i := 0 to sg.RowCount - 2 do
    begin
      pos := i;
      val := StrToInt(sg.Cells[1, i]);
      if (val < 0) then
        raise EConvertError.Create('menor que 0');
    end;
    pos := sg.rowcount - 1;
    StrToFloat(sg.Cells[1, sg.rowcount - 1]);
    Result := True;
  except
    on EConvertError do
    begin
      if pos = -1 then
        raise Exception.Create(
          'TBaseEditoresFichas.validarTablaPeriodicidad, ERROR; pos=-1');
      if pos < 2 then
        ShowMessage(mesValorIntroducidoDebeNumYMayor0)
      else
        ShowMessage(mesValorIntroducidoDebeNum);
      sg.row := pos;
      Result := False;
    end
  end; // try
end;

function TBaseEditoresFichas.validarPeriodicidad(CBperiodicidad: Tcheckbox;
  CBLargo: TComboBox; ELPer, EFIni, EFFin: Tedit; integers: TStringGrid): boolean;
begin
  if CBperiodicidad.Checked then
    Result := (CBLargo.ItemIndex <> -1) and validarEditInt(ELPer, 1, MAXINT) and
      validarEditFecha(EFIni) and validarEditFecha(EFFin) and
      validarTablaPeriodicidad(integers)
  else
    Result := True;
end;

procedure TBaseEditoresFichas.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  inherited;
end;

procedure TBaseEditoresFichas.CBPeriodicidadChange(Sender: TObject);
begin
  if CBPeriodicidad.Checked then
  begin
    PPeriodicidad.Enabled := True;
    PPeriodicidad.Show;
  end
  else
  begin
    PPeriodicidad.Enabled := False;
    PPeriodicidad.Hide;
  end;
end;

procedure TBaseEditoresFichas.CBLargoPeriodoChange(Sender: TObject);
begin
  guardado := False;
end;

procedure TBaseEditoresFichas.FormCreate(Sender: TObject);
begin
  inherited;
end;

procedure TBaseEditoresFichas.panelPeriodicidadClick(Sender: TObject);
begin

end;

procedure TBaseEditoresFichas.sgPeriodicidadValidarCambio(tabla: TStringGrid);
begin
  if (validarSg) and (tabla.cells[1, filaValidarSG] <> loQueHabia) then
  begin
    try
      begin
        StrToFloat(tabla.cells[1, filaValidarSG]);
        guardado := False;
      end
    except
      on EConvertError do
      begin
        tabla.Cells[1, filaValidarSG] := loQueHabia;
        ShowMessage(mesValorIntroducidoDebeNum);
      end;
    end;
  end;
  //   validarSg := true;
end;

procedure TBaseEditoresFichas.sgPeriodicidadKeyDown(Sender: TObject;
  var Key: word; Shift: TShiftState);
begin
  validarSg := (Sender as TStringGrid).Cells[TStringGrid(Sender).col,
    TStringGrid(Sender).row] <> loQueHabia;
  if (Key in teclas) then
    sgPeriodicidadValidarCambio(TStringGrid(Sender));
end;

procedure TBaseEditoresFichas.Free;
begin
  if (Self.ModalResult <> mrOk) and (ficha <> nil) then
    ficha.Free;
  inherited Free;
end;

initialization
end.
