#include"Persona.h"
#include<fstream>
using namespace std;
/* Implantacion de  los metodos de la clase 
 * Persona*/



//Los constructores no tienen valor de retorno
//Constructor por omision
Persona::Persona(){ 
	//Valores asignados por omision
	strcpy(nombre, "Ninguno");
	strcpy(apellido,"Ninguno");
	edad=0;
	cedula=0;
	telefonoHogar=0;
	telefonoCelular=0;
	strcpy(direccion,"Ninguna");
}
//Constructor por copia
Persona::Persona(const Persona& p1){
	strcpy(nombre, p1.nombre);
	strcpy(apellido, p1.apellido);
	edad=p1.edad;
	strcpy(direccion, p1.direccion);
	cedula = p1.cedula;
	telefonoHogar = p1.telefonoHogar;
	telefonoCelular = p1.telefonoCelular;
}
//Constructor parametrico
Persona::Persona(const char _nom[],const 
char _apel[], const short &_edad, const char _dir[],
const short _ced, const short _telH, const short 
_telC){
	strcpy(nombre, _nom);
	strcpy(apellido, _apel);
	edad=_edad;
	strcpy(direccion, _dir);
	telefonoHogar = _telH;
	telefonoCelular = _telC;
	cedula = _ced;
}

/*Métodos de acceso*/
char* Persona:: obtenerNombre() {return this->nombre; }

//Es equivalente retornar this->apellido 
char* Persona:: obtenerApellido() { return apellido ;} 

short Persona:: obtenerEdad() {return edad; }

char* Persona:: obtenerDireccion() {return direccion; }
short Persona:: obtenerCedula() {return cedula; }
short Persona:: obtenerTelefonoHogar() {return telefonoHogar; }
short Persona:: obtenerTelefonoCelular() {return telefonoCelular; }

/*Métodos de Modificación*/
void Persona:: asignarNombre(const char _nom[]){
	strcpy(nombre, _nom);
}
void Persona:: asignarApellido(const char _apel[]){
	strcpy(apellido, _apel);
}
void Persona:: asignarEdad(const short& _edad){
	edad=_edad;
}
void Persona:: asignarDireccion(const char  _dir[]){
	strcpy(direccion, _dir);
}
void Persona:: asignarCedula(const short& _ced){
	cedula=_ced;
}
void Persona:: asignarTelefonoHogar(const short& _telH){
	telefonoHogar=_telH;
}
void Persona:: asignarTelefonoCelular(const short& _telC){
	telefonoCelular=_telC;
}
/*Métodos para leer imprimir y asignar*/
void  Persona:: scan(){
	cout<<"Introduzca el nombre de la persona ";
	cin>>nombre;
	cout<<"Introduzca el apellido de la persona ";
	cin>>apellido;
	cout<<"Introduzca la edad de la persona ";
	cin>>edad;
	cout<<"Introduzca la cedula de la persona ";
	cin>>cedula;
	cout<<"Introduzca la direccion de la persona ";
	cin>>direccion;
	cout<<"Introduzca el telefono del hogar de la persona ";
	cin>>telefonoHogar;
	cout<<"Introduzca el telefono celular de la persona ";
	cin>>telefonoCelular;
}
//Metodo para mostrar los valores de los atributos
void Persona::print(){
	cout<<"Nombre: "<<nombre<<endl;
	cout<<"Apellido: "<<apellido<<endl;
	cout<<"Edad: "<<edad<<endl;
	cout<<"Cedula: "<<cedula<<endl;
	cout<<"Direccion: "<<direccion<<endl;
	cout<<"telefonoHogar: "<<telefonoHogar<<endl;
	cout<<"telefonoCelular: "<<telefonoCelular<<endl;
}

//Metodo para mostrar los valores de los atributos
void Persona::print2(){
	cout<<nombre << ":" <<apellido << ":" 
	<<edad <<":"<<cedula <<":"<<direccion
	<<":"<<telefonoHogar <<":"<<telefonoCelular
	<<endl;
}


//Destructor 
Persona::~Persona(){
/*Vacio*/	
}

//Sobre carga de operadores de escritura y 
//lectura de archivos
ostream &operator<<(ostream &file, const Persona &p) {
	file << p.nombre << ":" << p.apellido << ":"
	     << p.cedula << ":" << p.edad << ":"
	     << p.direccion << ":" << p.telefonoHogar << ":"
	     << p.telefonoCelular << endl ;
	return (file);
}

istream &operator>>(istream &file, Persona &p) {
	char linea[300];
	int telefonoHogar, telefonoCelular, cedula, 
	    edad;
	char nombre[20], apellido[20], direccion[100];

	file >> linea;
	sustituirCaracter(linea, ':');
	sscanf(linea, "%s %s %d %d %s %d %d",
		nombre,
		apellido,
		&cedula,
		&edad,
		direccion,
		&telefonoHogar,
		&telefonoCelular);
	p.asignarNombre(nombre);
	p.asignarApellido(apellido);
	p.asignarEdad(edad);
	p.asignarCedula(cedula);
	p.asignarDireccion(direccion);
	p.asignarTelefonoHogar(telefonoHogar);
	p.asignarTelefonoCelular(telefonoCelular);

	return (file);
}

// Funcion de auxiliar

void sustituirCaracter(char *cadena, char caracter){
	int i=0;
	while( cadena[i] != '\0'){
		if(cadena[i] == ':'){
			cadena[i] = ' ';
		}
		i++;
	}
}

bool Persona::buscarPersona(){
	ifstream file;
	Persona p;
	file.open("personas.txt");
	while ( ! file.eof() ){
		file >> p;
		if(this->cedula == p.cedula){
			strcpy(this->nombre, p.nombre);
			strcpy(this->apellido, p.apellido);
			this->edad = p.edad;
			strcpy(this->direccion, p.direccion);
			this->telefonoHogar = p.telefonoHogar;
			this->telefonoCelular = p.telefonoCelular;
			return true;
		}
	}
	return false;
}

bool Persona::eliminarPersona(){
	bool eliminado = false;
	if ( this->buscarPersona() ){
		ifstream file1;
		ofstream file2;
		Persona p;
		file1.open("personas.txt");
		file2.open("temporal.txt", ios::app);
		while ( ! file1.eof() ){
			file1 >> p;
			if(this->cedula != p.cedula){
				file2 << p;
			}
			else{
				eliminado = true;
			}
		}
		file1.close();
		file2.close();
		remove("personas.txt");
        	rename("temporal.txt","personas.txt");
	}
	if( eliminado ){
		return true;
	}
	else{
		return false;
	}
}


