unit uComparadorSalas;

{$mode Delphi}//{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, Grids, usalasdejuego, uInicioYFinal, ucosa, ucosaconnombre,
  ucosanubeseable, ucosaparticipedemercado, ufichasLPD, uActores,utilidades
  ;

type

  { TForm1 }

  TForm1 = class(TForm)
    btSelSala1: TButton;
    btSelSala2: TButton;
    btComparar: TButton;
    eArchiSala1: TEdit;
    eArchiSala2: TEdit;
    OpenDialog1: TOpenDialog;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;

    procedure btCompararClick(Sender: TObject);
    procedure btSelSala1Click(Sender: TObject);
    procedure btSelSala2Click(Sender: TObject);
    procedure CompararRecs(aRecLnk1, aRecLnk2: TCosa_RecLnk; cosaStr:String);
    procedure WriteLnEnGrid(strGrid: TStringGrid; cosaStr: String;
      aCampoLnk: TCosa_CampoLnk);
  private

  public
    i: Integer; //indice de seldas
  end;

var
  Form1: TForm1;
  sala1, sala2: TSalaDeJuego;


implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.btSelSala1Click(Sender: TObject);

var
  carpetaSala: String;
begin
  OpenDialog1.Filter := 'Sala SimSEE|*.ese';
  if OpenDialog1.Execute then
  begin
    eArchiSala1.Text := OpenDialog1.FileName;
    uInicioYFinal.AlInicio;
    sala1 := usalasdejuego.cargarSala(0, eArchiSala1.Text, '', True);
    carpetaSala := sala1.dirSala;
   { sala1.Free;
    uInicioYFinal.AlFinal;}
  end;

end;



procedure TForm1.btSelSala2Click(Sender: TObject);
var
  carpetaSala: String;
begin
  OpenDialog1.Filter := 'Sala SimSEE|*.ese';
  if OpenDialog1.Execute then
  begin
    eArchiSala2.Text := OpenDialog1.FileName;
    uInicioYFinal.AlInicio;
    sala2 := usalasdejuego.cargarSala(0, eArchiSala2.Text, '', True);
    carpetaSala := sala2.dirSala;
    {sala2.Free;
    uInicioYFinal.AlFinal; }
  end;

end;

procedure TForm1.CompararRecs(aRecLnk1, aRecLnk2: TCosa_RecLnk; cosaStr: String
  );
var
  aCampoLnk1, aCampoLnk2: TCosa_CampoLnk;
  k, iPos: Integer;
  lst, lst1, lst2: TListaDeCosasConNombre;
begin

  for k := 0 to aRecLnk1.Count - 1 do
  begin
    aCampoLnk1 := aRecLnk1[k];
    if not aRecLnk2.find(aCampoLnk1) then
    begin
      Inc(i);
      aCampoLnk2 := aRecLnk2[k];
      WriteLnEnGrid(StringGrid1, cosaStr , aCampoLnk1);
      WriteLnEnGrid(StringGrid2, cosaStr , aCampoLnk2);
    end;
  end;



 { for k := 0 to aRecLnk2.Count - 1 do
  begin
    aCampoLnk2 := aRecLnk2[k];

    if not aRecLnk1.find(aCampoLnk2) then
    begin
      WriteLn(cosaStr + ': ' + IntToStr(k) + ': ' + aCampoLnk.CampoDef.nombreCampo +
            ' (' + aCampoLnk.CampoDef.ClassName + '), = ' + aCampoLnk.StrVal);

    end;
  end; }

end;

procedure TForm1.WriteLnEnGrid(strGrid: TStringGrid; cosaStr: String;
  aCampoLnk: TCosa_CampoLnk);
begin

 { cosaStr + ', Sala1: ' + IntToStr(k) + ': ' + aCampoLnk1.CampoDef.nombreCampo +
            ' (' + aCampoLnk1.CampoDef.ClassName + '), = ' + aCampoLnk1.StrVal  }

  strGrid.Cells[0, i + 1] := cosaStr;
  if aCampoLnk<>nil then
  begin
  strGrid.Cells[1, i + 1] := aCampoLnk.CampoDef.nombreCampo;
 // strGrid.Cells[2, i + 1] := aCampoLnk.CampoDef.ClassName;
  strGrid.Cells[2, i + 1] := aCampoLnk.StrVal;
  end
  else
  begin
    strGrid.Cells[1, i + 1] := '-';
    strGrid.Cells[2, i + 1] := '-';
   // strGrid.Cells[3, i + 1] := '-';
  end;


end;



procedure TForm1.btCompararClick(Sender: TObject);
var
  aRecLnk1, aRecLnk2: TCosa_RecLnk;
  k, ipos, j: Integer;
  lst1, lst2: TListaDeCosasConNombre;
  aCosa1, aCosa2: TCosaConNombre;
  aArchi: TArchiRef_Nubeseable;
  fichas1, fichas2: TFichasLPD;
  aFicha, ficha1, ficha2: TFichaLPD;


  procedure FichasIguales(fichas1,fichas2:TFichasLPD;nombreCosa:String);
  var
    j,ipos:Integer;
    RecLnk1, RecLnk2: TCosa_RecLnk;
  begin
    if (fichas1 <> nil) and (fichas2 <> nil) then
    begin
      for j:=0 to fichas1.Count-1 do
      begin
        ficha1:=fichas1[j];
        if (fichas2).find(ficha1,ipos) then
        begin
          ficha2:=fichas2[ipos];
          RecLnk1:=ficha1.rec_lnk;
          RecLnk2:=ficha2.rec_lnk;
          CompararRecs(RecLnk1,RecLnk2,nombreCosa + DateTimeToStr(ficha1.fecha.dt) );
        end
        else
        begin
          inc(i);
          WriteLnEnGrid(StringGrid1, nombreCosa + DateTimeToStr(ficha1.fecha.dt)  , nil);
          WriteLnEnGrid(StringGrid2, 'Ficha no encontrada' , nil);
          //WriteLn(nombreCosa  + ficha1.fechaMasInfoAd + ': no encontrada en Sala2');
        end;
      end;

      for j:=0 to fichas2.Count-1 do
      begin
        ficha2:=fichas2[j];
        if not (fichas1).find(ficha2,ipos) then
        begin
          inc(i);
          WriteLnEnGrid(StringGrid2, nombreCosa + DateTimeToStr(ficha1.fecha.dt) , nil);
          WriteLnEnGrid(StringGrid1, 'Ficha no encontrada' , nil);
          //WriteLn(nombreCosa + ficha2.fechaMasInfoAd + ': no encontrada en Sala1'); ;
        end;

      end;
    end;
  end;

begin

  StringGrid1.ColCount := 3;
  StringGrid2.ColCount := 3;
  StringGrid1.RowCount := 10;
  StringGrid2.RowCount := 10;

  StringGrid1.Cells[0, 0] := 'Cosa';
  StringGrid1.Cells[1, 0] := 'Nombre Campo';
 // StringGrid1.Cells[2, 0] := 'Nombre Clase';
  StringGrid1.Cells[2, 0] := 'Valor';

  StringGrid2.Cells[0, 0] := 'Cosa';
  StringGrid2.Cells[1, 0] := 'Nombre Campo';
 // StringGrid2.Cells[2, 0] := 'Nombre Clase';
  StringGrid2.Cells[2, 0] := 'Valor';

  i:=-1;

  aRecLnk1:=sala1.rec_lnk;
  aRecLnk2:=sala2.rec_lnk;

  CompararRecs(aRecLnk1,aRecLnk2,'Sala');

  //Globs

  aRecLnk1:=sala1.globs.rec_lnk;
  aRecLnk2:=sala2.globs.rec_lnk;

  CompararRecs(aRecLnk1,aRecLnk2,'Globs');



  //Actores

  lst1:=sala1.listaActores;
  lst2:=sala2.listaActores;

  for k:=0 to lst1.Count-1 do
  begin
    aCosa1:=lst1[k];
    if TListaDeCosasConNombre(lst2).find(aCosa1.nombre,ipos) then
    begin
      aCosa2:=lst2[ipos];
      aRecLnk1:=aCosa1.rec_lnk;
      aRecLnk2:=aCosa2.rec_lnk;
      CompararRecs(aRecLnk1,aRecLnk2,aCosa1.nombre);
      //Sus Fichas  ///////////
        fichas1:=TCosaParticipeDeMercado(aCosa1).lpd;
        fichas2:=TCosaParticipeDeMercado(aCosa2).lpd;
        FichasIguales(fichas1,fichas2,aCosa1.nombre + '.FichaLPD ' );

        fichas1:=TActor(aCosa1).lpdUnidades;
        fichas2:=TActor(aCosa2).lpdUnidades;
        FichasIguales(fichas1,fichas2,aCosa1.nombre + '.FichaLPDUnid ');

        fichas1:=TActor(aCosa1).lpdForzamientos;
        fichas2:=TActor(aCosa2).lpdForzamientos;
        FichasIguales(fichas1,fichas2,aCosa1.nombre + '.FichaLPDForz ');
      /////////////////////
    end
    else
    begin
      inc(i);
      WriteLnEnGrid(StringGrid1, aCosa1.nombre , nil);
      WriteLnEnGrid(StringGrid2, 'Cosa no encontrada' , nil);
      //WriteLn(aCosa1.nombre + ': no encontrado en Sala2');
    end;


  end;

  for k:=0 to lst2.Count-1 do
  begin
    aCosa2:=lst2[k];
    if not TListaDeCosasConNombre(lst1).find(aCosa2.nombre,ipos) then
    begin
      inc(i);
      WriteLnEnGrid(StringGrid2, aCosa2.nombre , nil);
      WriteLnEnGrid(StringGrid1, 'Cosa no encontrada' , nil);
      //WriteLn(aCosa2.nombre + ': no encontrado en Sala1');
    end;

  end;


  //Fuentes

  lst1:=sala1.listaFuentes_;
  lst2:=sala2.listaFuentes_;

  for k:=0 to lst1.Count-1 do
  begin
    aCosa1:=lst1[k];
    if TListaDeCosasConNombre(lst2).find(aCosa1.nombre,ipos) then
    begin
      aCosa2:=lst2[ipos];
      aRecLnk1:=aCosa1.rec_lnk;
      aRecLnk2:=aCosa2.rec_lnk;
      CompararRecs(aRecLnk1,aRecLnk2,aCosa1.nombre);
      //Sus Fichas  ///////////
      fichas1:=TCosaParticipeDeMercado(aCosa1).lpd;
      fichas2:=TCosaParticipeDeMercado(aCosa2).lpd;
      FichasIguales(fichas1,fichas2,aCosa1.nombre+ '.FichaLPD ');
      /////////////////////
    end
    else
    begin
      inc(i);
      WriteLnEnGrid(StringGrid1, aCosa1.nombre , nil);
      WriteLnEnGrid(StringGrid2, 'Cosa no encontrada' , nil);
      //WriteLn(aCosa1.nombre + ': no encontrado en Sala2');
    end;
  end;

  for k:=0 to lst2.Count-1 do
  begin
    aCosa2:=lst2[k];
    if not TListaDeCosasConNombre(lst1).find(aCosa2.nombre,ipos) then
    begin
      inc(i);
      WriteLnEnGrid(StringGrid2, aCosa2.nombre , nil);
      WriteLnEnGrid(StringGrid1, 'Cosa no encontrada' , nil);
      //WriteLn(aCosa2.nombre + ': no encontrado en Sala1');
    end
  end;



  //Combustibles

  lst1:=sala1.listaCombustibles;
  lst2:=sala2.listaCombustibles;

  for k:=0 to lst1.Count-1 do
  begin
    aCosa1:=lst1[k];
    if TListaDeCosasConNombre(lst2).find(aCosa1.nombre,ipos) then
    begin
      aCosa2:=lst2[ipos];
      aRecLnk1:=aCosa1.rec_lnk;
      aRecLnk2:=aCosa2.rec_lnk;
      CompararRecs(aRecLnk1,aRecLnk2,aCosa1.nombre);
      //Sus Fichas  ///////////
      if aCosa1 is  TCosaParticipeDeMercado then
      begin
        fichas1:=TCosaParticipeDeMercado(aCosa1).lpd;
        fichas2:=TCosaParticipeDeMercado(aCosa2).lpd;
        FichasIguales(fichas1,fichas2,aCosa1.nombre+ '.FichaLPD ');
      end;
      /////////////////////
    end
    else
    begin
      inc(i);
      WriteLnEnGrid(StringGrid1, aCosa1.nombre , nil);
      WriteLnEnGrid(StringGrid2, 'Cosa no encontrada' , nil);
      //WriteLn(aCosa1.nombre + ': no encontrado en Sala2');
    end;
  end;

  for k:=0 to lst2.Count-1 do
  begin
    aCosa2:=lst2[k];
    if not TListaDeCosasConNombre(lst1).find(aCosa2.nombre,ipos) then
    begin
      inc(i);
      WriteLnEnGrid(StringGrid2, aCosa2.nombre , nil);
      WriteLnEnGrid(StringGrid1, 'Cosa no encontrada' , nil);
      //WriteLn(aCosa2.nombre + ': no encontrado en Sala1');
    end
  end;


  //Archivos

 { lst1:=sala1.archs;
  lst2:=sala2.archs;  }

  for k:=0 to sala1.archs.Count-1 do
  begin
    aArchi:=sala1.archs[k];
    if TListaDeArchiRef_Nubeseable(sala2.archs).find(aArchi.ArchiRef.get_archi,ipos) then
    begin
      aRecLnk1:=sala1.archs[k].rec_lnk;
      aRecLnk2:=sala1.archs[ipos].rec_lnk;
      CompararRecs(aRecLnk1,aRecLnk2,aArchi.ArchiRef.get_archi);
    end
    else
    begin
      inc(i);
      WriteLnEnGrid(StringGrid1, aArchi.ArchiRef.get_archi , nil);
      WriteLnEnGrid(StringGrid2, 'Archivo no encontrado' , nil);
      //WriteLn(aArchi.ArchiRef.get_archi + ': no encontrado en Sala2');
    end;

  end;

  for k:=0 to sala2.archs.Count-1 do
  begin
    aArchi:=sala2.archs[k];
    if not TListaDeArchiRef_Nubeseable(sala1.archs).find(aArchi.ArchiRef.get_archi,ipos) then
    begin
      inc(i);
      WriteLnEnGrid(StringGrid2, aArchi.ArchiRef.get_archi , nil);
      WriteLnEnGrid(StringGrid1, 'Archivo no encontrado' , nil);
      //WriteLn(aArchi.ArchiRef.get_archi + ': no encontrado en Sala1');
    end;

  end;

  AutoSizeCol(StringGrid1, 0);
  AutoSizeCol(StringGrid1, 1);
  AutoSizeCol(StringGrid1, 2);
//  AutoSizeCol(StringGrid1, 3);
  AutoSizeCol(StringGrid2, 0);
  AutoSizeCol(StringGrid2, 1);
  AutoSizeCol(StringGrid2, 2);
 // AutoSizeCol(StringGrid2, 3);

end;

end.

