/* Programa agenda.c 
  
   Mini-agenda

   Por CuCo (Rodrigo Hausen)

   Este programa manipula os dados gravados no arquivo agenda.dat
   no diretorio corrente. Se nao houver esse arquivo, ele e criado
   automaticamente.

   Nota: os registros são numerados a partir do 0. Assim, o
   primeiro registro é 0, o segundo é 1, ...

*/

#include <stdio.h>
#include <stdlib.h>

FILE *arquivo;
char *nomearq="agenda.dat";

struct pessoa{
  char nome[40];
  char telefone[20];
  char endereco[80];
  int idade;
};

int Escolhe() {
  int opcao;

  do {
    printf ("\nMini-agenda\n\n");
    printf ("1 - Mostrar um registro\n");
    printf ("2 - Mostrar todos os registros\n"); 
    printf ("3 - Incluir um registro\n");
    printf ("4 - Apagar o ultimo registro\n");
    printf ("5 - Mostrar pessoas mais velhas do que uma certa idade\n");
    printf ("6 - Apagar um registro qualquer\n");
    printf ("0 - Sair\n\n");
    printf ("Opcao:");
    scanf("%d",&opcao);
  } while(opcao<0||opcao>6);
  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");
}

void MaiorIdade() {
  printf ("\nImplemente esta funcao!\n");
}

void ApagaRegistro() {
  printf ("\nImplemente esta funcao!\n");
}

main () {
  int opcao;

  arquivo = fopen(nomearq,"ab+");

  do {
    opcao = Escolhe();
    if (opcao == 1) MostraRegistro();
    if (opcao == 2) MostraTodos();
    if (opcao == 3) IncluiRegistro();
    if (opcao == 4) ApagaUlt();
    if (opcao == 5) MaiorIdade();
    if (opcao == 6) ApagaRegistro();
  } while (opcao!=0);

  printf ("Ate logo!\n");
}
