//modulo principal de inmueble

# include <iostream.h>
# include <fstream.h>
# include <iomanip.h>
# include <stdlib.h>
# include <stdio.h>
# include <ctype.h>
# include "proyec.h"


int obtOpcion();
void archivo(fstream&);
void actualizar(fstream&);
void agregar(fstream&);
void borrar(fstream&);
void imprimir(ostream&, const inmueble&);
int obtenerCodigo(const char *);
enum elecciones{TEXTFILE = 1, UPDATE, NEW, DELETE, END};

int main()
{
	clrscr();
	fstream introducir("inmueble.dat", ios::in | ios::out);
	
	if(!introducir){
		cerr<< "El archivo no pudo abrirse."<< endl;
		exit(1);
	}
	
	int opcion;
	
	while((opcion = obtOpcion())!=END){
	clrscr();
		
		switch(opcion){			
			case 1:
				archivo(introducir);
				break;			
			case 2:
				actualizar(introducir);
				break;			
			case 3:
			//case 3:
				agregar(introducir);
				break;			
			case 4:
				borrar(introducir);
				break;
			default:
				cerr<< "No es una eleccion valida\n";
				break;
		}
		introducir.clear();
	}
	return 0;
}

int obtOpcion()
{
clrscr();
	cout << "\n\n\n\tElija una Opcion\n\n"<< endl;
	cout << "\t1 -> Guardar\n\n";
//	cout << "\t2 -> Imprimir\n\n";
	cout << "\t2 -> Modificar\n\n";
	cout << "\t3 -> Agregar\n\n";
	cout << "\t4 -> Borrar\n\n";
	cout << "\t5 -> Salir\n\n";

	int eleccion;
	cout<< "\n\n\t=====> "; cin >> eleccion;
	return eleccion;
}

void archivo(fstream &leerArchivo)
{
clrscr();
	ofstream imprime("imprimir.txt", ios::out);
	
	if(!imprime){
		cerr<< "No se pudo abrir el archivo."<< endl;
		exit(1);
	}	
	
	cout<< setiosflags(ios::left)<< setw(10)<< "Codigo" << setw(20) <<"Direccion" << setw(10) << "Tipo" << setw(15) << "Habitaciones" << setw(7) <<"Precio" << setw(13) << "Propietario" << setw(10) << "Disp" <<endl;
	cout<< "=============================================================================\n";

		leerArchivo.seekg(0);
		
		inmueble imueble;
		leerArchivo.read((char*)(&imueble), sizeof(inmueble));
		
		while(!leerArchivo.eof()){
			if(imueble.cod_inm !=0)
				imprimir(imprime,imueble);
				
			leerArchivo.read((char*)(&imueble), sizeof(inmueble));
		}
		cout<<"\n\n\tPrecione una tecla para volver al menu: ";getch();
}

void actualizar(fstream &actualizArchivo)
{
clrscr();
	int codigo = obtenerCodigo("ACTUALIZAR\nIntroduzca el codigo del inmueble");

	actualizArchivo.seekg((codigo-1) * sizeof(inmueble));
	
	inmueble imueble;
	actualizArchivo.read((char*)(&imueble), sizeof(inmueble));
	imprimir(cout, imueble);	
		
	if(imueble.cod_inm != 0){
		cout << "\nDireccion ";gets(imueble.dir);
		cout << "\nTipo inmueble ";gets(imueble.tipo_inm);
		cout << "\nNo habitaciones ";cin >> imueble.num_hab;
		cout << "\nPrecio Alq. ";cin >> imueble.prec_alq;
		cout << "\nCodigo Propietario ";cin >> imueble.cod_prop;
		cout << "\nEsta disponible? ";gets(imueble.disp);
		imueble.cod_inm=codigo;
		actualizArchivo.seekp((codigo-1) * sizeof(inmueble));
		actualizArchivo.write((char*)(&imueble), sizeof(inmueble));
	}
	else
		cerr << "El codigo "<< codigo << " no tiene informacion." << endl;
}

void agregar(fstream &guardar)
{
clrscr();
	int codigo = obtenerCodigo("AGREGAR\nIntroduzca el codigo");
//******
	guardar.seekg((codigo-1) * sizeof(inmueble));
	
	inmueble imueble;
	guardar.read((char*)(&imueble), sizeof(inmueble));
	
	if(imueble.cod_inm == 0){
		cout << "\nDireccion : ";gets(imueble.dir);
		cout << "\nTipo inmueble : ";gets(imueble.tipo_inm);		
		cout << "\nNo habitaciones : ";cin >> imueble.num_hab;		
		while(!cin){
			cin.clear();
			cin.ignore();
			cout << "\n\tDebe ser un numero entero : ";cin >> imueble.num_hab;
		}
		cout << "\nPrecio Alq. : ";cin >> imueble.prec_alq;
		while(!cin){
			cin.clear();
			cin.ignore();
			cout << "\n\tIntroduzca un precio valido : ";cin >> imueble.num_hab;
		}
		cout << "\nCodigo Propietario (1 - 100): ";cin >> imueble.cod_prop;
		while(!cin){
			cin.clear();
			cin.ignore();
			cout << "\n\tEl codigo debe ser un numero entero entre 1 y 100 : ";cin >> imueble.num_hab;
		}		
		cout << "\nEsta disponible? S/N : ";gets(imueble.disp);
		imueble.cod_inm=codigo;
		guardar.seekp((codigo-1) * sizeof(inmueble));
		guardar.write((char*)(&imueble), sizeof(inmueble));
		cout<< "\n\nPrecione una tecla para volver al menu principal: "; getch();
	}
	else
		cerr<< "La cuenta "<< codigo<< " ya tiene informacion."<< endl;
		cout<< "\n\nPrecione una tecla para volver al menu principal: "; getch();
}

void borrar(fstream &borraReg)
{
clrscr();
	int codigo = obtenerCodigo("Introduzca el codigo");
	char bor;
	borraReg.seekg((codigo-1) * sizeof(inmueble));
	
	inmueble imueble;
	borraReg.read((char*)(&imueble), sizeof(inmueble));
	imprimir(cout, imueble);
	
	cout<< "Esta seguro que quiere quiere borrar el registro? S/N";cin>>bor;
	if(bor=='S' || bor=='s'){
	//-------------------------
	if(imueble.cod_inm != 0){
		inmueble borrar = {0,"","",0,0.0,0,""};
		
		borraReg.seekp((codigo-1) * sizeof(inmueble));
		borraReg.write((char*)(&borrar), sizeof(inmueble));
		cout << "El registro "<< codigo <<" fue borrado"<< endl;
		cout<< "\n\nPrecione una tecla para volver al menu principal: "; getch();		
	}
	else {
		cerr<< "La registro "<< codigo<< " esta vacio"<< endl;
		cout<< "\n\nPrecione una tecla para volver al menu principal: "; getch();
	}
	}
}

void imprimir(ostream &salida, const inmueble &i)
{
	cout<< setiosflags(ios::left)<< setw(10)<< i.cod_inm<< setw(20) <<i.dir<< setw(10) <<  i.tipo_inm<< setw(15) << i.num_hab << setw(7)<<  i.prec_alq<< setw(13)<<  i.cod_prop<< setw(10)<< i.disp << '\n';
	cout<< "=============================================================================\n";	
}

int obtenerCodigo(const char *prompt)
{
clrscr();
	int codigo;
	
	do{
		cout<< prompt << " : ";
		cin >> codigo;
	} while(codigo <1 || codigo >100);
	
	return codigo;
}