#include "persona.h"
#include <iostream>
#include <cstdio>

//using std::cout;
//using std::endl;

//using namespace std;

void printFilenameOnly(const String& filename)
{
	for ( String::length_t i = 0; i < filename.length(); ++i )
	{
		if ( filename[i] == '.' )
			break;
		std::cout << filename[i];
	}
	std::cout << std::endl;
}

int main()
{
	// Un metodo estatico solo puede acceder a variables estaticas
	std::cout << "total personas: " << Persona::obtenerTotalPersonas() << std::endl;

	// esto crea un objeto completo de ~104 bytes, no un puntero de 8 bytes ni una
	// refeferencia como ocurre en Java, y luego llama al constructor por defecto
	Persona persona;

	// Crea un objeto automatico persona1 utilizando el constructor mas general
	Persona persona1(101929328, Fecha(7,5,2000), mujer, "Ana Soto");
	persona1.imprimir();
//	std::cout << (const char*) persona1.obtenerNombreCompleto() << std::endl;

	String filename = "archivo.txt";
	printFilenameOnly(filename);
	filename[0] = '_';
	std::cout << filename(2,5);
//	FILE* file = fopen(filename, "r");
	//...
//	fclose(file);
/*
	// Crea un ojeto en memoria dinamica con el operador new, el cual llama al constructor
	Persona* persona2 = new Persona(191990212, Fecha(), hombre);
	persona2->imprimir();

	// Crea un arreglo de objetos, a cada uno se le invoca el constructor por defecto
	Persona* familia = new Persona[3];
	for ( size_t i = 0; i < 3; ++i )
		familia[i].imprimir();
	for ( size_t i = 0; i < 3; ++i )
		familia[i].imprimir();

	// Imprime el total de objetos de la clase Persona creados hasta el momento
	std::cout << "total personas: " << Persona::obtenerTotalPersonas() << std::endl;

#if 0
	// persona es un objeto, no un puntero, por lo que se usa el operador .
	// para acceder a los miembros publicos
	std::cout << "Edad 1 en años cumplidos: " << persona1.calcularEdad() << std::endl;
	std::cout << "Edad 2 en años cumplidos: " << persona2->calcularEdad() << std::endl;
	std::cout << "Edad f.2 en años cumplidos: " << familia[1].calcularEdad() << std::endl;
#endif

	// persona2 es un objeto alojado en memoria dinamica, evitar fugas
	delete persona2;
	persona2 = NULL; // innecesario, pero es una buena practica

	// Eliminar un arreglo requiere el operador delete[] y no delete
	delete [] familia;
*/
	return 0;
}
