#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <process.h>
#include "multime.h"

#define INSERT 0
#define DELETE 1

char menu(void);
void operatie(MULTIME a, char *denMultime, int tipOperatie);

void main()
{
    int n;
    char zona[200];
    MULTIME a=NULL,b=NULL,r=NULL;
    printf("\nNr. maxim de elemente:");
    scanf("%d",&n);
    while(1)
    {
        switch(menu())
        {
        case 'A':
            if(a!=NULL) destroySet(a);
            a=newSet(n);
            break;
        case 'B':
            if(b!=NULL) destroySet(b);
            b=newSet(n);
            break;
        case 'I':
            operatie(a, "A", INSERT);
            break;
        case 'J':
            operatie(b, "B", INSERT);
            break;
        case 'D':
            operatie(a, "A", DELETE);
            break;
        case 'F':
            operatie(b, "B", DELETE);
            break;
        case 'G':
            printf("\nA=%s",conv_multime_sir(a,zona));
            break;
        case 'H':
            printf("\nB=%s",conv_multime_sir(b,zona));
            break;
        case 'R':
            printf("\nA U B=%s",
                   conv_multime_sir( r=Union(a,b) , zona));
            destroySet(r);
            break;
        case 'X':
            destroySet(a);
            destroySet(b);
            return;
        default:
            printf("\n Optiune inexistenta");
        }
    }
}


char menu()
{
    printf("\n A-Initializare multime A ");
    printf("\n B-Initializare multima B ");
    printf("\n I-Inserare A ");
    printf("\n J-Inserare B ");
    printf("\n D-Delete A ");
    printf("\n F-Delete B ");
    printf("\n G-Afiseaza A ");
    printf("\n H-Afiseaza B ");
    printf("\n R-Afiseaza A U B ");
    printf("\n S-Afiseaza A intersectat B ");
    printf("\n T-Afiseaza A \\ B ");
    printf("\n X-Exit ");
    printf("\n");
    printf("\n Introduceti optiunea: ");
    return toupper(getche());
}
// -----------------------------------------------------------------
// Procedura operatie este scrisa pentru acest program demo
// fiind si o ilustrare a utilizarii tablourilor de pointeri
// la functii. Procedura are urmatoarele argumente:
//    e - multimea cu care se va executa operatia (insert / delete)
//    denMultime - numele multimii (necesar pt. ev. mesaje de err.)
//	 tipOperatie - tipul operatiei (0 = insert, 1 = delete)
// Procedura citeste de la tastatura elementul de inserat/sters.
// In cazul operatiei delete verifica apartenenta elementului.
// -----------------------------------------------------------------

void operatie(MULTIME e, char *denMultime, int tipOperatie)
{
    char *denOperatii[]= {"inserat","eliminat"};
    MULTIME (*operatii[])(MULTIME e, DATA k)= {insert,Delete};
    DATA x;
    if(e!=NULL)
    {
        printf("\nElementul de %s in %s:",
               denOperatii[tipOperatie], denMultime);
        scanf(FORMAT,&x);
        if(x<0 || x>= cardinal(e))
            printf("\nElementul "FORMAT" nu poate apartine lui %s:", x, denMultime);
        else if (tipOperatie==DELETE && !member(e,x))
            printf("\nElementul "FORMAT" nu apartine lui %s:", x, denMultime);
        else
            e=operatii[tipOperatie](e,x);
    }
    else
        printf("\nNu ati initializat multimea %s:",denMultime);
}
