# ifndef ARCHIVO_PERSONA
# define ARCHIVO_PERSONA

#include "ArchivoHash.h"
#include "Persona.h"

using namespace std;

class ArchivoPersona : public ArchivoHash<Persona>{
	typedef struct buffer{
		bool libre;
		char nombre[15];
		char apellido[15];
		char cedula[15];
		short edad;
		char direccion[200];
		short telefonoHogar;
		short telefonoCelular;
		long proximo;
	};
public:
	bool Leer(fstream&, long, t_comp&);
	bool Escribir(fstream&, long, t_comp);
	long hash(Persona);
	long tamanoRegistro();
};

//--------------------LEER-----------------------

bool ArchivoPersona::Leer(fstream &archivo, long posicion, t_comp &comp){
	buffer elemento;
	long posicion_real = posicion * tamanoRegistro();
	long total = numMaxRegPrincipal * tamanoRegistro();
	if (posicion_real < 0 || posicion_real > total)
		return false;
	archivo.seekg(posicion_real);
	archivo.read(reinterpret_cast<char*>(&elemento), tamanoRegistro());
	if (archivo.fail())
		return false;
	comp.libre = elemento.libre;
	comp.registro.asignarNombre(elemento.nombre);
	comp.registro.asignarApellido(elemento.apellido);
	comp.registro.asignarCedula(elemento.cedula);
	comp.registro.asignarEdad(elemento.edad);
	comp.registro.asignarDireccion(elemento.direccion);
	comp.registro.asignarTelefonoHogar(elemento.telefonoHogar);
	comp.registro.asignarTelefonoCelular(elemento.telefonoCelular);
	comp.proximo = elemento.proximo;
	return true;
}

//---------------ESCRIBIR------------------------

bool ArchivoPersona::Escribir(fstream &archivo, long posicion, t_comp comp){
	buffer elemento;
	long posicion_real = posicion * tamanoRegistro();
	long total = numMaxRegPrincipal * tamanoRegistro();
	if (posicion_real < 0 || posicion_real > total)
		return false;
	elemento.libre = comp.libre;
	strcpy(elemento.nombre, comp.registro.obtenerNombre());
	strcpy(elemento.apellido, comp.registro.obtenerApellido());
	strcpy(elemento.cedula, comp.registro.obtenerCedula());
	elemento.edad = comp.registro.obtenerEdad();
	strcpy(elemento.direccion, comp.registro.obtenerDireccion());
	elemento.telefonoHogar = comp.registro.obtenerTelefonoHogar();
	elemento.telefonoCelular = comp.registro.obtenerTelefonoCelular();
	elemento.proximo = comp.proximo;
	archivo.seekp(posicion_real);
	archivo.write(reinterpret_cast<char*>(&elemento), tamanoRegistro());
	if (archivo.fail())
		return false;
	return true;
}


// Funcion Hash

long ArchivoPersona::hash(Persona p){
	string clave = p.obtenerCedula();
	if (clave.length() <= 0)
		return (long)-1;
	long acumulador = 0;
	for (int i = 0; i < clave.length(); i++)
		acumulador += (long)(clave[i]) * (long)(clave[i]);
	return (long)(acumulador % numMaxRegPrincipal);
}

//---------------TAMANO_REGISTRO-----------------

long ArchivoPersona::tamanoRegistro(){
	buffer elemento;
	return (long)(sizeof(elemento));
}

# endif

