#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Este programa permite ingresar nombres de tiendas y agregar productos a las tiendas.

typedef struct productos{  //Se define estructura para productos, probar agregar mas campos (ej: Precio, cantidad en stock)
    char p1[30];
    struct productos *sig;
}prod;

typedef struct tiendas_prod{  //Estructura para tiendas.
    char nombre[30];
    struct productos *lista;
    struct tiendas_prod *sig;
}tiendas;

//Se declaran las funciones.
int Manejar_Tiendas(tiendas **tienda);
int Mostrar_Tiendas(tiendas *tienda);
int Agregar_Productos(tiendas **tienda);
int Mostrar_Productos(prod *lista);

int main()
{
    tiendas *tienda=NULL;
    char opcion;

    //Bucle infinito para menu.
    while(1){
        system("cls");
        printf("1.- Agregar Tienda\n"
               "2.- Agregar Productos a tienda\n"
               "3.- Mostrar Tiendas\n"
               "4.- Salir\n");
        while(opcion=getch(), opcion<'1' || opcion>'4');

        switch(opcion){
            case '1':
                Manejar_Tiendas(&tienda);break;
            case '2':
                Agregar_Productos(&tienda);break;
            case '3':
                Mostrar_Tiendas(tienda);break;
            case '4':
                system("pause");
                return 0;
        }
        system("pause");

    }
}

int Manejar_Tiendas(tiendas **tienda)
{
    tiendas *nodo=NULL, *rec; //Variables auxiliares a utilizar.

    nodo=(tiendas*)malloc(sizeof(tiendas)); //Se reserva espacio en memoria para agregar nueva tienda.
    if(nodo==NULL) //Habrá memoria disponible?
    {
        printf("No hay memoria suficiente.\n");
        return 1;
    }
    nodo->sig=NULL; //Se inicializan los campos de la variable.
    nodo->lista=NULL;
    printf("Ingrese nombre de la tienda a agregar:\n");
    gets(nodo->nombre); //Se ingresa el nombre de la tienda.

    if(!*tienda) //Si no hay tienda, se crea una
    {
        *tienda=nodo;
        return 0;
    }
    else{
        rec=*tienda;
        while(rec->sig) //Se recorren nodos hasta encontrar espacio vacío.
            rec=rec->sig;
        rec->sig=nodo;  //El ultimo nodo sera el de la tienda agregada.
    }
    return 0;
}

int Agregar_Productos(tiendas **tienda)
{
    char n_tienda[30];
    tiendas *rec_t;   //Para recorrer las tiendas.
    prod *nodo_p, *rec_p; //nodo_p es nodo nuevo de productos, y rec_p para recorrer lista de productos.
    nodo_p=(prod*)malloc(sizeof(prod)); //Se reserva memoria para producto nuevo a agergar.

    if(nodo_p==NULL) //Habrá memoria suficiente?
    {
        printf("No hay memoria disponible.\n");
        return 1;
    }
    rec_t=*tienda;     //Se le da la direccion inicial de tienda para recorrerla.
    nodo_p->sig=NULL;  //Se inicializa el nodo siguiente al producto.
    printf("Ingrese nombre de la tienda a agregar productos:\n");
    gets(n_tienda); //Se ingresa el nombre de la tienda a la cual se le quiere agregar producto.
    while(rec_t)
    {
        if(strcmp(rec_t->nombre,n_tienda)==0) //Si se encuentra coincidencia se rompe el ciclo.
            break;
        rec_t=rec_t->sig;
    }
    if(!rec_t) //Existe tienda a buscar?
    {
        printf("No se encontr%c tienda especificada.\n");
        free(nodo_p);
        return 1;
    }
    printf("Ingrese nombre del producto a agregar:\n");
    gets(nodo_p->p1); //Producto a agregar.
    if(!rec_t->lista) //Si la tienda no tiene productos se crea una lista de productos.
    {
        rec_t->lista=nodo_p;
    }
    else{
        rec_p=rec_t->lista; //Se recorre hasta encontrar un espacio vacio en la lista de productos.
        while(rec_p->sig)
            rec_p=rec_p->sig;
        rec_p->sig=nodo_p; //El nodo se agrega al final de la lista de productos
    }
    return 0;
}

int Mostrar_Tiendas(tiendas *tienda) //Muestra tienda en pantalla.
{
    if(!tienda) //Habrán tiendas?
    {
        printf("No hay tiendas ingresadas.\n");
        return 1;
    }

    while(tienda) //Mientras hayan tiendas se muestran.
    {
        printf("Tienda: %s\n\n", tienda->nombre);
        Mostrar_Productos(tienda->lista); //Se llama a la funcion para mostrar productos en tienda.
        tienda=tienda->sig;
    }
    return 0;
}

int Mostrar_Productos(prod *lista) //Muestra productos en tienda.
{
    if(!lista) //Hay productos en la tienda?
    {
        printf("No hay productos en la tienda.\n\n");
        return 1;
    }
    printf("Productos en la tienda:\n");
    while(lista) //Se muestran productos mientras los hayan.
    {
        printf("%s\n", lista->p1);
        lista=lista->sig;
    }
    printf("\n");
    return 0;
}
