#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct agenda{ /*Creación de la estructura*/
char *name /*Variable que guarda el nombre de la persona*/;
char *paterno; /*Variable que guarda el apellido paterno de la persona*/
char *materno; /*Variable que guarda el apellido materno de la persona*/
char *mail; /*Variable que guarda el correo electronico de la persona*/
int rut;  /*Variable que guarda el rut de la persona*/
char *phone; /*Variable que guarda el telefono de la persona*/  
}; /*Estructura Creada*/
 
/*Declaracion de Funciones*/
int menu ();
int validacion();
void llenado (struct agenda personas);
void modificado (struct agenda people);
void busqueda (struct agenda files);
/*Fin de declaracion de funciones*/  
 
int menu () /*Funcion de Menu Principal*/
{
int opcion; /*Variable que guarda la decision tomada por el usuario*/
system ("clear");
printf ("\n");  
printf ("___________ Menu Principal ___________\n");
printf ("(1)Ingresar datos al sistema.\n");
printf ("(2)Modificar datos del sistema.\n");
printf ("(3)Buscar datos.\n");
printf ("(4)Salir.\n");
printf ("Escoja Opcion:\n");
printf ("________ Hecho por Pablo Munoz. _______\n");
scanf ("%d",&opcion);  
return (opcion);
}
 
void llenado (struct agenda personas)
{
struct agenda *c; /*puntero de tipo agenda que apunta a la estructura*/
struct agenda nodo[n]; /*Cadena de tipo agenda que contiene cada campo de la estructura (cadena de estructura)*/
FILE *puntero;  /*Puntero de tipo FILE que apuntara al archivo que queramos crear/modificar*/
int i=0;
int j;
int b;   /*Variable que almacena el valor del rut para ser enviado a la funcion validacion*/
int k;    /*Guarda el valor que retorna la funcion validacion i.e almacena el codigo verificador*/
int v;   /*Almacena el codigo verificador ingresado por el usuario y lo compara con k para validar si son iguales*/
int opc; /*Variable que indica si estan los datos ingresados por el usuario de manera correcta*/
int opi; /*Variable que indica si el usuario quiere seguir ingresando usuarios*/  
char buffer[50];  /*Buffer temporal que almacena los datos ingresados como NOMBRE por el usuario*/
char buffer1[50]; /*Buffer temporal que almacena los datos ingresados como APELLIDO PATERNO por el usuario*/
char buffer2[50]; /*Buffer temporal que almacena los datos ingresados como APELLIDO MATERNO por el usuario*/
char buffer3[50]; /*Buffer temporal que almacena los datos ingresados como TELEFONO por el usuario*/
char buffer4[50]; /*Buffer temporal que almacena los datos ingresados como MAIL por el usuario*/
   c=(struct agenda *)malloc(sizeof(struct agenda));  
  printf ("Ingrese RUT, sin codigo verificador:  ");
  scanf ("%d",&b);
  k=validacion(b);
  do{
  printf ("Ingrese Codigo Verificador.\nEn caso de ser K, reemplazelo por un 0 (cero):  ");
  scanf ("%d",&v);
  if (k!=v) printf ("Ingrese un codigo valido:\n");
    }
  while (k!=v);
    personas.rut=b;
  
    
  printf ("\nIngrese Nombre:  ");
  scanf("%s",buffer);
  c->name=(char *)malloc(strlen(buffer)+1);
  if (c->name) strcpy(c->name,buffer);
      
 
  printf ("Ingrese Apellido Paterno:  ");
  scanf("%s",buffer1);
  c->paterno=(char *)malloc(strlen(buffer1)+1);
  if (c->paterno) strcpy(c->paterno,buffer1);
    
    
  printf ("Ingrese Apellido Materno:  ");
  scanf("%s",buffer2);
  c->materno=(char *)malloc(strlen(buffer2)+1);
  if (c->materno) strcpy(c->materno,buffer2);
 
  printf ("Ingrese Numero de Telefono:  ");
  scanf("%s",buffer3);
  c->phone=(char *)malloc(strlen(buffer3)+1);
  if (c->phone) strcpy(c->phone,buffer3);
      
    
  printf ("Ingrese Correo Electronico:  ");
  scanf("%s",buffer4);
  c->mail=(char *)malloc(strlen(buffer4)+1);
  if (c->mail) strcpy(c->mail,buffer4);
  
  do 
  {
  printf ("\n");
    printf ("_____________________________________\n");  
   printf ("RUT: %d-%d\n",personas.rut,v);
  printf ("Nombre: %s\n",c->name);
  printf ("Apellido Paterno: %s\n",c->paterno);
  printf ("Apellido Materno: %s\n",c->materno);
  printf ("Telefono: %s\n", c->phone);
  printf ("Correo Electronico: %s\n",c->mail);  
 
  printf ("¿Estan los datos correctos?\n 1) Si \n 2) No (volvera al menu principal)\n");
  scanf ("%d",&opc);
  if (opc==1)
  {
    system ("clear");
    printf ("¿Desea Agregar Otra Persona?\n1) Si \n2) No\n");
    scanf("%d",&opi);
    if (opi==1){
  puntero=fopen("datos.txt","a");
  if (puntero == '\0') printf ("Error al abrir el archivo");
  fprintf(puntero,"%d %s %s %s %s %s\n",personas.rut,c->name,c->paterno,c->materno,c->phone,c->mail);                  
  fclose(puntero);    
  llenado(*c);
    }
    if (opi==2){
  puntero=fopen("datos.txt","a");
  if (puntero == '\0') printf ("Error al abrir el archivo");
  fprintf(puntero,"%d %s %s %s %s %s\n",personas.rut,c->name,c->paterno,c->materno,c->phone,c->mail);                  
  fclose(puntero);    
  printf ("Datos Guardados de forma exitosa.");
  main();
    }
  }
  if (opc==2) main();
    if (opc!=1 && opc!=2) printf ("Ingrese una opcion valida por favor.\n");
  }  
  while (opc>2 || opc<1);        
}  
 
void modificado (struct agenda people)
{
struct agenda *c;
struct agenda nodo[50];  
char cad[80];
int rut;
FILE *puntero;
  c=(struct agenda *)malloc(sizeof(struct agenda));  
  printf ("Ingrese RUT de la persona que desea modificar, sin codigo verificador:  ");
  scanf ("%d",&rut);
  puntero=fopen("datos.txt","r");
  if (puntero == '\0') printf ("Error al abrir el archivo");
    while (feof!=0){
/*fread( *buffer, tamaño, nº de veces, puntero_fichero );*/
    fclose(puntero);
    }
}  
 
void busqueda (struct agenda files)
{
}
 
int validacion (int rut) /*Funcion de validacion del RUT*/
{
int acumulador=0; /*Variable que va sumando la multiplicacion del ultimo digito del rut por el contador*/
int multiplo; /*Variable que almacena la multiplicacion el digito del RUT por un contador*/
int contador=2; /*Variable que es multiplicada por el digito del RUT (es 2 porque el algoritmo de validacion es asi*/
int digito; /*Variable que almacena el digito verificador*/
int rutdigito; /*Variable que almacena el codigo verificador ingresado por el usuario validado para el K y el 0*/
while (rut!=0){
multiplo=(rut%10)*contador;
acumulador=acumulador+multiplo;
rut=rut/10;
contador=contador+1;
if(contador==8) contador=2;
}
digito=11-(acumulador%11);
rutdigito=digito;
if (digito==10) rutdigito=0;
if (digito==11) rutdigito=0;
return (rutdigito);
}  
 
 
 
 
 
 
 
/*Main*/
main ()
{
 
struct agenda *gente;/*Creamos un puntero del tipo agenda de nombre gente i.e cuando queramos enviar la estructura a una funcion, solo utilizaremos *gente*/
int op;/*Variable que almacena el valor que retorna la funcion menu (es decir la decision de lo que quiera hacer el usuario con el programa*/
  op=menu();
      switch (op)
    {
      case 1: llenado(*gente);
          main();
      break;
      case 2: modificado(*gente);
          main();
      break;
      case 3: busqueda(*gente);
            main();
      break;
      case 4: system ("clear");
      printf ("Hecho por Pablo Muñoz Moreno.\n");
      break;
      default:printf ("\n\nOpcion no valida. Reintente por favor.");
      main();    
        break;
    }
}