/* newagenda.h
  
   Definicoes das funcoes usadas no programa newagenda.h

   Por CuCo (Rodrigo Hausen)

*/

extern FILE *arquivo;
extern char *nomearq;

int Escolhe() {
  int opcao;

  do {
    printf ("\nMini-agenda\n\n");
    printf ("%d - Mostrar um registro\n",MOSTRA_REG);
    printf ("%d - Mostrar todos os registros\n",MOSTRA_TODOS); 
    printf ("%d - Incluir um registro\n",INCLUI_REG);
    printf ("%d - Apagar o ultimo registro\n",APAGA_ULT);
    printf ("%d - Sair\n\n",FIM);
    printf ("Opcao:");
    scanf("%d",&opcao);
  } while(opcao < FIM ||opcao > ULTIMA_OPCAO);
  return opcao;
}

void MostraRegistro() {
  int reg;
  struct pessoa umapessoa;

  printf ("Digite o número do registro: ");
  scanf ("%d", &reg);

  // posiciona o arquivo no registro desejado
  fseek(arquivo,reg*sizeof(struct pessoa),SEEK_SET);

  // le o registro
  fread(&umapessoa, sizeof(struct pessoa), 1, arquivo);

  // se o registro realmente existe, ao executar uma leitura
  // no arquivo, o indicador de fim de arquivo nao devera
  // estar setado. Se nao existir, teremos EOF
  if (feof(arquivo)) {
    printf("Registro nao existente!\n");
    return;
  }
 
  // mostra dados
  printf ("Nome: %s\n",umapessoa.nome);
  printf ("Telefone: %s\n",umapessoa.telefone);
  printf ("Endereco: %s\n",umapessoa.endereco);
  printf ("Idade: %d\n\n",umapessoa.idade);
}

void MostraTodos() {
  int reg;
  struct pessoa umapessoa;

  // posiciona o arquivo no inicio
  fseek(arquivo,0,SEEK_SET);

  reg=0;
  do {
    // le registro
    fread(&umapessoa, sizeof(struct pessoa), 1, arquivo);

    // se chegou ao fim, para
    if (feof(arquivo)) break;

    // mostra dados
    printf ("\nRegistro numero: %d\n",reg);
    printf ("Nome: %s\n",umapessoa.nome);
    printf ("Telefone: %s\n",umapessoa.telefone);
    printf ("Endereco: %s\n",umapessoa.endereco);
    printf ("Idade: %d\n\n",umapessoa.idade);
    printf ("--------------------------------\n");

    reg++;
  } while(!feof(arquivo));  // repete enquanto nao chegar ao fim
}

void IncluiRegistro() {
  char lixo[255];
  struct pessoa umapessoa;

  // limpa o buffer do teclado -> veja programa editor.c
  gets(lixo);

  // posiciona o arquivo no final
  fseek(arquivo,0,SEEK_END);

  // coloca os dados da pessoa no registro umapessoa
  printf ("\nDigite os dados da pessoa nos campos abaixo:\n");
  printf ("Nome:");
  gets(umapessoa.nome);
  printf ("Telefone:");
  gets(umapessoa.telefone);
  printf ("Endereco:");
  gets(umapessoa.endereco);
  printf ("Idade:");
  scanf("%d",&umapessoa.idade);   // note que idade e um inteiro!

  // grava o registro no final do arquivo
  fwrite(&umapessoa, sizeof(struct pessoa), 1, arquivo);

  printf ("Registro gravado!\n");
}

// a funcao ApagaUlt copia o arquivo agenda.dat para um arquivo
// temporario. Depois, copia todos os registros menos o ultimo
// do arquivo temporario para o arquivo agenda.dat

void ApagaUlt() {
  FILE *temporario;
  int nregs,reg;
  struct pessoa umapessoa;

  temporario=fopen("_temp.xxx","ab+");

  // posiciona o arquivo no inicio
  fseek(arquivo,0,SEEK_SET);

  nregs=0;
  do{
    // le de agenda.dat
    fread(&umapessoa, sizeof(struct pessoa), 1, arquivo);
    // salva no temporario
    fwrite(&umapessoa, sizeof(struct pessoa), 1, temporario);
    nregs++;
  } while(!feof(arquivo));

  fclose(temporario);

 
  // apago o arquivo agenda.dat, fechando o arquivo e chamando
  // a funcao remove
  fclose(arquivo);
  remove(nomearq);
  arquivo=fopen(nomearq,"ab+");
  // grava todos os registros, menos o último
  temporario=fopen("_temp.xxx","rb");
  for (reg=0;reg<nregs-2;reg++) {
    fread(&umapessoa, sizeof(struct pessoa), 1, temporario);    
    fwrite(&umapessoa, sizeof(struct pessoa), 1, arquivo);    
  }

  fclose(temporario);

  // deleta o arquivo temporario
  remove("_temp.xxx");
}
