#include "agenda.h"
#include <stdio.h>
#include <stdlib.h>

Vista *ins_vista(Vista *v, Agenda *e){
    Vista *new=malloc(sizeof(Vista));
    new->elem=e;
    new->next=v;
    return new;
}

void print_vista(Vista *v){
    if (v==NULL) return ;
    print_persona(v->elem->chi);
    print_data(v->elem->quando);
    printf("\n");
    print_vista(v->next);
}

void free_vista(Vista *v){
    if (v) {
        free_vista(v->next);
        free(v);
    }
}

Vista *select_persona(Agenda *lista, Persona *persone, char *nome, char *cognome){
    Vista *res=NULL;
    Persona *persona=cerca_persona(persone, nome, cognome);
    if (persona==NULL) return NULL;
    for( ; lista!=NULL; lista=lista->next){
        if (lista->chi==persona)
            res=ins_vista_sort_by_data(res,lista);
    }
    return res;
}

Vista *select_giorno(Agenda *lista, Giorno g){
    Vista *res=NULL;
    for( ; lista!=NULL; lista=lista->next){
        if (confronta_giorno(lista->quando.giorno,g)==0)
            res=ins_vista(res,lista);
    }
    return res;
}

Vista *ins_vista_sort_by_data(Vista *v, Agenda *e){
    if (v==NULL || confronta_giorno(e->quando.giorno,v->elem->quando.giorno)<=0){ 
        Vista *new=malloc(sizeof(Vista));
        new->elem=e; 
        new->next=v;  
        return new;
    }
    v->next=ins_vista_sort_by_data(v->next, e);
    return v;
}

Agenda *trova_sovrapposta(Agenda *lista, Data data){
    if (lista==NULL) return NULL;
    if (confronta_data(lista->quando,data)==1) return lista;
    return trova_sovrapposta(lista->next, data);
}

Agenda *ins_agenda(Agenda *lista, Persona **persone, char *nome, char *cognome, Data data){
    Agenda *new=malloc(sizeof(Agenda));
    Persona *persona;

    if (trova_sovrapposta(lista, data)!=NULL) {
        free(new);
        return lista;
    }

    new->quando=data;
    persona=cerca_persona(*persone, nome, cognome);
    if (persona!=NULL) 
        new->chi=persona;
    else {
        *persone=ins_persona(*persone, nome, cognome);
        new->chi=*persone;
    }
    new->next=lista;
    return new;
}

void print_agenda(Agenda *lista){
    if (lista==NULL) return;
    print_persona(lista->chi);
    print_data(lista->quando);
    printf("\n");
    print_agenda(lista->next);
}

