// OliviaTasks.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "OliviaTasks.h"
#include "olv_task.h"
#include "OlvTaskProcess.h"
#include "utl.h"
#include "olv_dll.h"
#include "olv.h"
#include "_log.h"
#include "Msmain.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include "GeometryFunction.h"
#include "StrArray.h"
#include "ClienteLicencias.h"
#include "_app.h"

// The one and only application object

//! Clase principal de OliviaTasks
/*!
 * Es la interface entre el AddIn de Olivia y el core de calculos Olivia.dll
 * 
 */

CWinApp theApp;

using namespace std;

BOOL coge_param(char *cmdline, OlvTaskProcess *task);

//! Funcion principal
/**
 * Funcion principal que inicia la aplicacion al ser llamada por el AddIn
 */
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{

	int nRetCode = 0;

	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		_tprintf(_T("Fatal Error: MFC initialization failed\n"));
		nRetCode = 1;
	}
	else
	{
		OlvApp.olv = new COlivia();
		Msmain mp;
		OlvApp.olv->mfrm = &mp;
		mp.olv = OlvApp.olv;

		//inicia log-------------------------------------------------
		C_app* app = C_app::GetApp();
		app->archi.rellena_dirs_ejecucion();
#ifdef _DEBUG

		HWND Stealth;
		AllocConsole();

		Stealth = FindWindowA("ConsoleWindowClass", NULL);
		ShowWindow(Stealth,SW_SHOWNORMAL);

	#endif 
		//pilla path temporal
		StrArray buf;
		strcpy(app->log.nombre,"Olivia");
		int nn = Cutl::stringSplit(lpCmdLine,"/path_temp:", &buf)->n_i;
		if(nn>=2 && Cutl::stringSplit(buf.get(1)," /", &buf)->n_i>nn)
			strcpy(app->log.path,buf.get(nn));
		buf.borra();

#ifdef _DEBUG
		system("pause");
#endif

		//verifica versión-----------------------------------
		ClienteLicencias lic;		
		char strtem[MAX_PATH];
		app->archi.rellena_dirs_ejecucion();
		strcpy_s(strtem,MAX_PATH,app->archi.path_ejecutable);
		Cdir_manager::dir_anterior(strtem);
		sprintf(lic.dirLic,"%s\\", strtem);
		sprintf(lic.dirTemp,"%s\\", app->log.path);
		if(!lic.cargaLicencia())
		{
			C_log::log("_tmain", "Error al comprobar versión");
#ifdef _DEBUG
			system("pause");
#endif
		}
		

		C_log::log("_tmain","Inicio OliviaTask: %s", lpCmdLine);
		mp.Despacha_log();
		//verifica modo debug----------------------------------------
		if(strstr(lpCmdLine,"debug"))
		{
			OlvApp.olv->modo_ejec=OLV_EJEC_DEBUG_SIGUE;
		}
		
		
		char err[1024];
		if(!OlvApp.olv->inicia(lpCmdLine, err,1024))
		{
			C_log::log("_tmain",err);
		}
		else
		{
			if(OlvApp.olv->isDebug)
			{
#ifdef _DEBUG
				system("pause");
#endif;
				OlvApp.olv->prueba();
			}
			mp.Despacha();
		}
		C_log::log("_tmain","Final feliz!!");
		mp.Despacha_log();
		OlvApp.olv->mfrm =NULL;

#ifdef _DEBUG
		system("pause");
#endif		
	}

	return nRetCode;
}
//*************************************************************************************
/**
 * Dada la línea de comandos, la divide en los parámetros necesarios 
 * (Funcion para modo multitask)
 */
BOOL coge_param(char *cmdline, OlvTaskProcess *task)
{
	char *token;
	int j;

	//los parámetros son:
	//\olivia \tipo_oliv \cfg.ini \ip \puerto \toutsock
	token = strtok(cmdline, TASKS_PARAM_SEP);
	
	//Lee parámetros
	j=0;
	while (token != NULL)
	{
		if(j==0)
		{
			//ip
			strcpy_s(OlvApp.ip,64,token);
		}
		else if(j==1)
		{
			//puerto
			OlvApp.port=atoi(token);	
		}
		else if(j==2)
		{
			//ithr
			task->ithr = atoi(token);
		}		
		token = strtok(NULL, TASKS_PARAM_SEP);
		j++;
	}
	if(j<3)
		return FALSE; //no ha leído los param suficientes
	return TRUE;
}
