#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

FILE *maes, *mov, *maestmp, *historico;
struct clientes{
  char nombre[11], apellidos[21], direccion[21], telefono[11];
  int codigo;
};
struct maestro {
  int codigo;
  char nombre[11], apellidos[21];
  char direccion[21], telefono[11];
}regmaes;
struct movi {
  char tipo;
  int codigo;
  char nombre[10], apellidos[20];
  char direccion[20], telefono[10];
}regmov;

void limpiar1(), limpiar2();

void main(void){
  struct clientes cli;
  mov=fopen("k:\\files\\clientes.mov","r+b");
  if ((maes=fopen("k:\\files\\clientes.dat","r+b"))==NULL){
    //fclose(maes);
    maes=fopen("k:\\files\\clientes.dat","w+b");
    while (!feof(mov)){
      limpiar1();limpiar2();
      fread(&regmov,sizeof(regmov),1,mov);
      if (regmov.tipo=='A') {
	strcpy (regmaes.apellidos,regmov.apellidos);
	strcpy (regmaes.nombre,regmov.nombre);
	regmaes.codigo=regmov.codigo;
	strcpy (regmaes.direccion,regmov.direccion);
	strcpy (regmaes.telefono,regmov.telefono);
	clrscr();
	printf ("%d \n%s \n%s \n%s \n%s", regmaes.codigo, regmaes.nombre,regmaes.apellidos, regmaes.direccion, regmaes.telefono);
	getch();
	fwrite (&regmaes,sizeof(struct maestro),1,maes);
      }
    }
  }
  else{
    fclose(maes);
    system("rename k:\\files\\clientes.dat clientes.tmp");
    maes=fopen("k:\\files\\clientes.dat","w+b");
    maestmp=fopen("k:\\files\\clientes.tmp","rb");
    historico=fopen("k:\\files\\clientes.log","a+b");
    limpiar1();limpiar2();
    fread(&regmov,sizeof(regmov),1,mov);
    fread(&regmaes,sizeof(regmaes),1,maestmp);
    while (!feof(mov) && !feof(maestmp)){
      if (regmaes.codigo==regmov.codigo){
	if(regmov.tipo=='A'){
	  printf("Error cliente duplicado.");getch();
	  fwrite(&regmaes,sizeof(regmaes),1,maes);
	  limpiar1();limpiar2();
	  fread(&regmov,sizeof(regmov),1,mov);
	  fread(&regmaes,sizeof(regmaes),1,maestmp);
	}
	else{
	  if (regmov.tipo=='B'){
	    printf("Dando de baja...");
	    fwrite(&regmaes,sizeof(regmaes),1,historico);
	    limpiar1();limpiar2();
	    fread(&regmov,sizeof(regmov),1,mov);
	    fread(&regmaes,sizeof(regmaes),1,maestmp);
	  }
	  else{
	    fwrite(&(regmov.codigo),2,1,maes);
	    fwrite(&(regmov.nombre),11,1,maes);
	    fwrite(&(regmov.apellidos),21,1,maes);
	    fwrite(&(regmov.direccion),21,1,maes);
	    fwrite(&(regmov.telefono),11,1,maes);
	    limpiar1();limpiar2();
	    fread(&regmov,sizeof(regmov),1,mov);
	    fread(&regmaes,sizeof(regmaes),1,maestmp);
	  }
	}
      }
      else{
	if(regmov.codigo>regmaes.codigo){
	  fwrite(&regmaes,sizeof(regmaes),1,maes);
	  limpiar2();
	  fread(&regmaes,sizeof(regmaes),1,maestmp);
	}
	else{
	  if (regmov.tipo=='A'){
	    fwrite(&(regmov.codigo),2,1,maes);
	    fwrite(&(regmov.nombre),10,1,maes);
	    fwrite(&(regmov.apellidos),20,1,maes);
	    fwrite(&(regmov.direccion),20,1,maes);
	    fwrite(&(regmov.telefono),10,1,maes);
	  }
	  else{
	    printf("Error: El cliente no existe.");getch();
	  }
	  limpiar1();
	  fread(&regmov,sizeof(regmov),1,mov);
	}
      }
    } // fin del while


    if (!feof(mov)){
      while(!feof(mov)){
	if(regmov.tipo=='A'){
	  strcpy (regmaes.apellidos,regmov.apellidos);
	  strcpy (regmaes.nombre,regmov.nombre);
	  regmaes.codigo=regmov.codigo;
	  strcpy (regmaes.direccion,regmov.direccion);
	  strcpy (regmaes.telefono,regmov.telefono);
	  clrscr();
	  printf ("%d \n%s \n%s \n%s \n%s", regmaes.codigo, regmaes.nombre,regmaes.apellidos, regmaes.direccion, regmaes.telefono);
	  getch();
	  fwrite (&regmaes,sizeof(struct maestro),1,maes);
	}
	else{
	  printf("Error: El cliente no existe.");getch();
	}
	limpiar1();
	fread(&regmov,sizeof(regmov),1,mov);
      }
    }
    else{
      if(!feof(maestmp)){
	while(!feof(maestmp)){
	  fwrite(&regmaes,sizeof(regmaes),1,maes);
	  limpiar2();
	  fread(&regmaes,sizeof(regmaes),1,maestmp);
	}
      }
    }
    fcloseall();
  }
  unlink("k:\\files\\clientes.mov");
  unlink("k:\\files\\clientes.tmp");
}

void limpiar1(){
      regmov.tipo=NULL;regmov.codigo=0;
      for (int n=0;n<21;n++){
	regmov.apellidos[n]=NULL;regmov.direccion[n]=NULL;
      }
      for(n=0;n<11;n++){
	regmov.nombre[n]=NULL;regmov.telefono[n]=NULL;
      }
}
void limpiar2(){
      for (int n=0;n<21;n++){
	regmaes.apellidos[n]=NULL;regmaes.direccion[n]=NULL;
      }
      for (n=0;n<11;n++){
	regmaes.nombre[n]=NULL;regmaes.telefono[n]=NULL;
      }
      regmaes.codigo=0;
}