//---------------------------------------------------------------------------
#include <registry.hpp>
#include <vcl.h>
#include <inifiles.hpp>
#include <stdio.h>
#pragma hdrstop

#include "TPropiedades.h"
#include "LEGO_COMM.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "DigitNum"
#pragma link "LM2000"
#pragma resource "*.dfm"
TPropiedades *Propiedades;
//---------------------------------------------------------------------------
__fastcall TPropiedades::TPropiedades(TComponent* Owner)
    : TForm(Owner)
{
 // Recuperar configuracion
        // Recuperamos la configuración
        TIniFile *ini;
        ini = new TIniFile( ExtractFileDir( Application->ExeName ) +  "\\CAP.INI"  );
        // General
        ComboBox1->ItemIndex = ini->ReadInteger( "CAP_c", "PuertoLego", 0 );
        DireccionesE->Text    = ini->ReadString(  "CAP_c", "IDsLegoE", "1;" );
        DireccionesS->Text    = ini->ReadString(  "CAP_c", "IDsLegoS", "2;" );
        Historial->Checked   = ini->ReadBool( "CAP_c", "historial", true );


        Capacidad->Text      = ini->ReadInteger( "parking", "Capacidad", 1000  );
        MsgCapacidad->Text   = ini->ReadString(  "parking", "MsgParking_lleno", "El parking esta lleno" );
//        ComboBox2->ItemIndex   = ini->ReadInteger(  "parking", "DiasDeCortesia", 0 );

        DB_host->Text    = ini->ReadString(  "db", "host",  "." );
        DB_login->Text   = ini->ReadString(  "db", "login", "NO_ES_SQL" );
        DB_pwd->Text     = ini->ReadString(  "db", "pwd",   "NO_ES_SQL" );

        /* Sobrecarga de franjas horarias */
/*
        CheckBox1->Checked = ini->ReadBool(  "horas", "sobrecargar", false );

        verL->Checked = ini->ReadBool(  "horas", "verL", false );
        desdeL->Text = ini->ReadString(  "horas", "desdeL", "00:00" );
        hastaL->Text = ini->ReadString(  "horas", "hastaL", "00:00" );

        verM->Checked = ini->ReadBool(  "horas", "verM", false );
        desdeM->Text = ini->ReadString(  "horas", "desdeM", "00:00" );
        hastaM->Text = ini->ReadString(  "horas", "hastaM", "00:00" );

        verX->Checked = ini->ReadBool(  "horas", "verX", false );
        desdeX->Text = ini->ReadString(  "horas", "desdeX", "00:00" );
        hastaX->Text = ini->ReadString(  "horas", "hastaX", "00:00" );

        verJ->Checked = ini->ReadBool(  "horas", "verJ", false );
        desdeJ->Text = ini->ReadString(  "horas", "desdeJ", "00:00" );
        hastaJ->Text = ini->ReadString(  "horas", "hastaJ", "00:00" );

        verV->Checked = ini->ReadBool(  "horas", "verV", false );
        desdeV->Text = ini->ReadString(  "horas", "desdeV", "00:00" );
        hastaV->Text = ini->ReadString(  "horas", "hastaV", "00:00" );

        verS->Checked = ini->ReadBool(  "horas", "verS", false );
        desdeS->Text = ini->ReadString(  "horas", "desdeS", "00:00" );
        hastaS->Text = ini->ReadString(  "horas", "hastaS", "00:00" );

        verD->Checked = ini->ReadBool(  "horas", "verD", false );
        desdeD->Text = ini->ReadString(  "horas", "desdeD", "00:00" );
        hastaD->Text = ini->ReadString(  "horas", "hastaD", "00:00" );
*/
        delete ini;

 StartEventRecorder("Historial.log");

 // Hacer efectivos los cambios
 bAplicarClick(0);
 LEGO_COMM = new CheckLEGOs(true);
 LEGO_COMM -> SetPuerto( ComboBox1->Items->Strings[ComboBox1->ItemIndex] );
 LEGO_COMM -> SetDB( DB_host->Text, DB_login->Text, DB_pwd->Text );
// LEGO_COMM -> SetDiasCortesia( ComboBox2->ItemIndex );
 LEGO_COMM -> SetLegoID( nLEGOSe, IDe, nLEGOSs, IDs );
 try {
         LEGO_COMM -> maxDENTRO = Capacidad->Text.ToInt();
 }catch(...){
         LEGO_COMM -> maxDENTRO = 2000;
 }
 LEGO_COMM -> Resume();
}
//---------------------------------------------------------------------------
void __fastcall TPropiedades::StartEventRecorder(AnsiString opLOG)
{
 try {
                                    // Cargamos todos los eventos anteriores
     mHistorial->Lines->LoadFromFile( opLOG );
                                    // Si hay demasiados registros
     if ( mHistorial->Lines->Count > 700 )
     {
       for ( int i=0; i<100; i++ )  // Eliminamos las 100 últimas entradas
        mHistorial->Lines->Delete( 3 );
     }
 } catch(...) {
     mHistorial->Lines->Clear();         // En caso de error, las eliminamos todas
 }
                                    //Fecha y hora del inicio de sesión
 mHistorial->Lines->Insert( 0, (Now()).DateTimeString() + " :: Inicio de la sesión" );
}
//---------------------------------------------------------------------------
void __fastcall TPropiedades::BorrarHistorialClick(TObject *Sender)
{
   mHistorial -> Lines -> Clear();
}
//---------------------------------------------------------------------------

void __fastcall TPropiedades::FormDestroy(TObject *Sender)
{
   if ( Historial -> Checked )
   {
     mHistorial -> Lines -> Insert( 0, TDateTime::CurrentDateTime().DateTimeString() + " :: Fin de sesión        ");
     mHistorial -> Lines -> SaveToFile( "Historial.log" );
   }
/*
  // Desactivamos el HILO de ejecución y esperamos hasta que acabe
  LEGO_COMM->Terminate();
  LEGO_COMM->WaitFor();
*/
   delete IDe;
   delete IDs;
}
//---------------------------------------------------------------------------

void __fastcall TPropiedades::mHistorialChange(TObject *Sender)
{
/*
  try {
    if ( Historial -> Checked )
        mHistorial -> Lines -> SaveToFile("Historial.log");
  } catch(...) {
   // do nothing
  }
*/
}
//---------------------------------------------------------------------------
void __fastcall TPropiedades::ActivarAplicar(TObject *Sender)
{
 if ( ! bDesBlock->Visible )
 {
  bAplicar->Enabled = true;
 }
}
//---------------------------------------------------------------------------



void __fastcall TPropiedades::bDesBlockClick(TObject *Sender)
{
// ComboBox2->Enabled = true;
 ComboBox1->Enabled = true;
 DireccionesE->Enabled =  true;
 DireccionesS->Enabled =  true;
 Capacidad->Enabled = true;
 MsgCapacidad->Enabled = true;
 DB_host->Enabled = true;
 DB_login->Enabled = true;
 DB_pwd->Enabled = true;

 bDesBlock->Visible = false;

}
//---------------------------------------------------------------------------

void __fastcall TPropiedades::bAplicarClick(TObject *Sender)
{
  if ( Sender )
  {
          // Guardamos los cambios...
        TIniFile *ini;
        ini = new TIniFile( ExtractFileDir( Application->ExeName ) +  "\\CAP.INI"  );
        // General
        ini->WriteInteger( "CAP_c", "PuertoLego", ComboBox1->ItemIndex );
        ini->WriteString(  "CAP_c", "IDsLegoE", DireccionesE->Text );
        ini->WriteString(  "CAP_c", "IDsLegoS", DireccionesS->Text );
        ini->WriteBool( "CAP_c", "historial", Historial->Checked );


        try {
                ini->WriteInteger( "parking", "Capacidad", Capacidad->Text.ToInt() );
        } catch(...) {
                ini->WriteInteger( "parking", "Capacidad", 1000 );
        }
        ini->WriteString( "parking", "MsgParking_lleno", MsgCapacidad->Text );
//                ini->ReadInteger(  "parking", "DiasDeCortesia", ComboBox2->ItemIndex );

        ini->WriteString(  "db", "host",  DB_host->Text );
        ini->WriteString(  "db", "login", DB_login->Text );
        ini->WriteString(  "db", "pwd", DB_pwd->Text );

        /* Sobrecarga de franjas horarias */
/*
        ini->WriteBool(  "horas", "sobrecargar", CheckBox1->Checked );

        ini->WriteBool(  "horas", "verL", verL->Checked );
        ini->WriteString(  "horas", "desdeL", desdeL->Text );
        ini->WriteString(  "horas", "hastaL", hastaL->Text );

        ini->WriteBool(  "horas", "verM", verM->Checked );
        ini->WriteString(  "horas", "desdeM", desdeX->Text );
        ini->WriteString(  "horas", "hastaM", hastaX->Text );

        ini->WriteBool(  "horas", "verX", verX->Checked );
        ini->WriteString(  "horas", "desdeX", desdeX->Text );
        ini->WriteString(  "horas", "hastaX", hastaX->Text );

        ini->WriteBool(  "horas", "verJ", verJ->Checked );
        ini->WriteString(  "horas", "desdeJ", desdeJ->Text );
        ini->WriteString(  "horas", "hastaJ", hastaJ->Text );

        ini->WriteBool(  "horas", "verV", verV->Checked );
        ini->WriteString(  "horas", "desdeV", desdeV->Text );
        ini->WriteString(  "horas", "hastaV", hastaV->Text );

        ini->WriteBool(  "horas", "verS", verS->Checked );
        ini->WriteString(  "horas", "desdeS", desdeS->Text );
        ini->WriteString(  "horas", "hastaS", hastaS->Text );

        ini->WriteBool(  "horas", "verD", verD->Checked );
        ini->WriteString(  "horas", "desdeD", desdeD->Text );
        ini->WriteString(  "horas", "hastaD", hastaD->Text );

*/




        if ( LEGO_COMM )
        {
                LEGO_COMM -> SetPuerto( ComboBox1->Items->Strings[ComboBox1->ItemIndex] );
                LEGO_COMM -> SetDB( DB_host->Text, DB_login->Text, DB_pwd->Text );
                LEGO_COMM -> SetDiasCortesia( 5);//ComboBox2->ItemIndex );
                 try {
                         LEGO_COMM -> maxDENTRO = Capacidad->Text.ToInt();
                 }catch(...){
                         LEGO_COMM -> maxDENTRO = 2000;
                 }
        }

        ini->UpdateFile();
        delete ini;
  }

  // Hacemos efectivos los cambios...
  ObtenDirLEGOS( DireccionesE->Text, nLEGOSe, &IDe );
  ObtenDirLEGOS( DireccionesS->Text, nLEGOSs, &IDs );
  if ( LEGO_COMM )
  {
          LEGO_COMM -> SetLegoID( nLEGOSe, IDe, nLEGOSs, IDs );
  }

  ////////// HAY QUE FINALIZAR EL HILO Y COMENZAR CON OTRO NUEVO
  bDesBlock->Visible = true;
// ComboBox2->Enabled = false;
 ComboBox1->Enabled = false;
 DireccionesE->Enabled =  false;
 DireccionesS->Enabled =  false;
 Capacidad->Enabled = false;
 MsgCapacidad->Enabled = false;
 DB_host->Enabled = false;
 DB_login->Enabled = false;
 DB_pwd->Enabled = false;  
  bAplicar->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TPropiedades::ObtenDirLEGOS(AnsiString cadena, int &nLEGOS, int **ID)
{
  char *pDir, buff[80], *pbuff;
  nLEGOS = 0; int i = 1, j=0;

          while ( i <= cadena.Length() )
          {
           if ( cadena[i] == ';' ) nLEGOS++;
           i++;
          }

  (*ID) = new int[nLEGOS];
  i = 1; pbuff = buff;
          while ( i <= cadena.Length() )
          {
           if ( cadena[i] == ';' )
           {
            *pbuff = '\0';
            try {
                        (*ID)[j++] = AnsiString( buff ).ToInt();
                } catch(...) {
                        nLEGOS--;
                        ShowMessage( "La configuración de direcciones LEGO'S es incorrecta" );
                }
                pbuff = buff; i++;
            }else{
                *(pbuff++) = cadena[i];
                i++;
            }
           }
}
/*

//---------------------------------------------------------------------------
bool __fastcall TPropiedades::entreHora(AnsiString hLo, AnsiString hHi)
{
 bool dev = false;
 try {
        TDateTime hora;
        hora = EncodeTime( (hLo.SubString(1,2)).ToInt(), (hLo.SubString(4,2)).ToInt(), 0, 0 );
        if ( TDateTime::CurrentTime() >= hora )
        {
          hora = EncodeTime( (hHi.SubString(1,2)).ToInt(), (hHi.SubString(4,2)).ToInt(), 0, 0 );
          dev = ( TDateTime::CurrentTime() <= hora );
        }
 } catch (...) {
  return false;
 }
 return dev;
}
//---------------------------------------------------------------------------
bool __fastcall TPropiedades::CheckHorario(void)
{
 bool dev = false;
 if ( CheckBox1->Checked )
 {
   switch ( TDateTime::CurrentDate().DayOfWeek() )
   {
    // Domingo
    case 1:
        if ( verD->Checked )
          dev = entreHora( desdeD->Text, hastaD->Text );
        break;
    // Lunes
    case 2:
        if ( verL->Checked )
          dev = entreHora( desdeL->Text, hastaL->Text );
        break;
    // Martes
    case 3:
        if ( verM->Checked )
          dev = entreHora( desdeM->Text, hastaM->Text );
        break;
    // Miercoles
    case 4:
        if ( verX->Checked )
          dev = entreHora( desdeX->Text, hastaX->Text );
        break;
    // Jueves
    case 5:
        if ( verJ->Checked )
          dev = entreHora( desdeJ->Text, hastaJ->Text );
        break;
    // Viernes
    case 6:
        if ( verV->Checked )
          dev = entreHora( desdeV->Text, hastaV->Text );
        break;
    // Sabado
    case 7:
        if ( verS->Checked )
          dev = entreHora( desdeS->Text, hastaS->Text );
        break;
    }
 }

 return dev;
}

void __fastcall TPropiedades::Timer1Timer(TObject *Sender)
{
  static bool horaVista = false, firstTime = true, cH;
  bool nH;

  nH = CheckHorario();

  if ( firstTime ) { horaVista=false; firstTime = false; cH = nH; }

  if ( cH != nH )  { horaVista = false;   cH = nH;  }

  if ( !horaVista && cH )       // Si no hemos visto este cambio
  {
    horaVista = true;
    sndPlaySound("snd\\fuera_de_hora.wav", SND_ASYNC | SND_FILENAME);
    LEGO_COMM -> RetiraPermisoSalida();
  }
}
*/
//---------------------------------------------------------------------------

void __fastcall TPropiedades::Label1DblClick(TObject *Sender)
{
  AnsiString cantidad;
  // Cambio del aforo
  if ( InputQuery( "Forzar lleno de aforo", "Nuevo aforo:" , cantidad ) )
  {
    try {
       Ocupacion->Value = cantidad.ToInt();
       LEGO_COMM -> crdDENTRO = Ocupacion->Value;
    } catch(...){
     //nothing
    }
  }
}
//---------------------------------------------------------------------------

