/*******************************************************************
	EPSON
	PROGRAMA PARA CONFIGURAR ECONOMIA DE PAPEL(LINUX) 
	DATA: 15/12/2025  
*******************************************************************/
// epsonEconomiaPapelTM.c : Defines the entry point for the console application.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <dlfcn.h>
#include <unistd.h>

#define FALSE	0
#define TRUE	1
#define SUCESSO_CONFIGURACAO 0
#define ERRO_CONFIGURACAO 1


int gravaArquivo(char* statusImpressora, char* statusConfigEconomiaPapel)
{
   int arquivoGravado = TRUE;
   
   FILE *arq;
   int arquivo = 0;
   struct tm *data_hora_atual;
   
   arq = fopen("logEconomiaPapel.txt", "a");//CRIA O ARQUIVO TEXTO PARA GRAVACAO
   if(arq == NULL)
   {
      printf("\nProblemas na criacao do arquivo\n");
      arquivoGravado = FALSE;
   }
   
   time_t segundos;
   time(&segundos);
   data_hora_atual = localtime(&segundos);
   
   arquivo = fprintf(arq, "|Impressora:%s|ConfigEconomiaPapel:%s|%02d/%02d/%02d|%02d:%02d:%02d|\n", statusImpressora, statusConfigEconomiaPapel, data_hora_atual->tm_mday, data_hora_atual->tm_mon+1,
data_hora_atual->tm_year+1900, data_hora_atual->tm_hour, data_hora_atual->tm_min, data_hora_atual->tm_sec);

   if(arquivo == EOF)
   {
      printf("\nErro na gravacao do arquivo\n");
      return arquivoGravado;
   }
   fclose(arq);   
   
   return arquivoGravado;
}   

typedef int (*Epson_IniciaPorta)          (const char *porta);
typedef int (*Epson_Le_Status)            ();
typedef int (*Epson_FechaPorta)           ();

void *LibraryHandle;

/********************************************************************
*	MAIN PARA TESTES
********************************************************************/
int main(int argc, char *argv[])
{
	Epson_IniciaPorta           _Epson_IniciaPorta;
	Epson_Le_Status             _Epson_Le_Status;	
	Epson_FechaPorta            _Epson_FechaPorta;	
	
	LibraryHandle = dlopen("./libInterfaceEpsonNF.so", RTLD_LAZY);	
	
	if(!LibraryHandle)
	{
		printf("erro ao carregar a lib\n");
		return 0x00;
	}

	_Epson_IniciaPorta          = (Epson_IniciaPorta)dlsym(LibraryHandle, "IniciaPorta");
	_Epson_Le_Status            = (Epson_Le_Status)dlsym(LibraryHandle, "Le_Status");	
	_Epson_FechaPorta           = (Epson_FechaPorta)dlsym(LibraryHandle, "FechaPorta");
	
	int ret = 0;
	char habilitaLog[] = "-log";
	char parametroLog[100];
	char parametroPorta[100];	
	char statusImpressora[50];
	char statusConfigEconomiaPapel[50];
	int tempo = 20;
    int STATUS_EXECUCAO = 0;
     
	if(argc > 1 && argv[1] != NULL)
	{
		strcpy(parametroPorta, argv[1]);		
	}
	else
	{
		strcpy(statusConfigEconomiaPapel, "Erro!");
		strcpy(statusImpressora, "Parametro da porta sem valor");
		ret = gravaArquivo(statusImpressora, statusConfigEconomiaPapel);
		return ERRO_CONFIGURACAO;					
	}

	if(argv[2] != NULL)
	{
		strcpy(parametroLog, argv[2]);		
	}
	
	//IniciaPorta
	time_t inicio = time(NULL);
	ret = _Epson_IniciaPorta(parametroPorta);
	time_t fim = time(NULL);
    //Tempo de execucao da funcao
	time_t tempo_execucao = fim - inicio;

	if(ret == 0)
	{
		strcpy(statusConfigEconomiaPapel, "Erro!");
		strcpy(statusImpressora, "Erro comunicacao porta =>> ");
		strcat(statusImpressora, parametroPorta);
	    STATUS_EXECUCAO = ERRO_CONFIGURACAO;					
	}
	else if(tempo_execucao > tempo && ret == 1)
	{
		ret = _Epson_Le_Status();
		if(ret == 0)
		{
			strcpy(statusImpressora, "Erro durante execucao");
		}
		else if(ret == 9)
		{
			strcpy(statusImpressora, "Tampa aberta");
		}
		else if(ret == 32)
		{
			strcpy(statusImpressora, "Sem papel");
		}
		strcpy(statusConfigEconomiaPapel, "Erro!");
		STATUS_EXECUCAO = ERRO_CONFIGURACAO;
	}
    else if(ret == 1)
	{
		strcpy(statusConfigEconomiaPapel, "Sucesso!");
		strcpy(statusImpressora, "Porta aberta com sucesso =>> ");
		strcat(statusImpressora, parametroPorta);			
		STATUS_EXECUCAO = SUCESSO_CONFIGURACAO;
	}
	
	if(strcmp(habilitaLog, parametroLog)==0)
	{
		//grava arquivo de log configuraca de papel
		ret = gravaArquivo(statusImpressora, statusConfigEconomiaPapel);

	}

	ret = _Epson_FechaPorta();

	return STATUS_EXECUCAO;
}