/* access_properties_and_parameters.c */

#include <libical/ical.h>
#include <stdlib.h>

/* Gets a particular parameter out of a component. This routine will
   return a list of strings of all attendees who are required. Note
   that this routine assumes that the component that we pass in is a
   VEVENT.  */

void get_required_attendees(icalcomponent* event)
{
    icalproperty* p;
    icalparameter* parameter;

    assert(event != 0);
    assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT);

    /* This loop iterates over all of the ATTENDEE properties in the
       event */

    /* The iteration routines save their state in the event
       struct, so the are not thread safe unless you lock the whole
       component. */

    for(
        p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY);
        p != 0;
        p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY)
        ) {

        /* Get the first ROLE parameter in the property. There should
           only be one, so we won't bother to iterate over them. But,
           you can iterate over parameters just like with properties */

        parameter = icalproperty_get_first_parameter(p,ICAL_ROLE_PARAMETER);

        /* If the parameter indicates the participant is required, get
           the attendees name and stick a copy of it into the output
           array */

        if ( icalparameter_get_role(parameter) == ICAL_ROLE_REQPARTICIPANT)
        {
            /* Remember, the caller does not own this string, so you
               should strdup it if you want to change it. */
            const char *attendee = icalproperty_get_attendee(p);
            printf("%s",attendee);
        }
    }

}

/* Here is a similar example. If an attendee has a PARTSTAT of
   NEEDSACTION or has no PARTSTAT parameter, change it to
   TENTATIVE. */

void update_attendees(icalcomponent* event)
{
    icalproperty* p;
    icalparameter* parameter;

    assert(event != 0);
        assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT);

    for(
        p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY);
        p != 0;
        p = icalcomponent_get_next_property(event,ICAL_ATTENDEE_PROPERTY)
        ) {

        parameter = icalproperty_get_first_parameter(p,ICAL_PARTSTAT_PARAMETER);

        if (parameter == 0) {

            /* There was no PARTSTAT parameter, so add one.  */
            icalproperty_add_parameter(
                p,
                icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE)
                );

        } else if (icalparameter_get_partstat(parameter) == ICAL_PARTSTAT_NEEDSACTION) {
            /* Remove the NEEDSACTION parameter and replace it with
               TENTATIVE */

            icalproperty_remove_parameter_by_kind(p,ICAL_PARTSTAT_PARAMETER);

            /* Don't forget to free it */
            icalparameter_free(parameter);

            /* Add a new one */
            icalproperty_add_parameter(
                p,
                icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE)
                );
        }

    }
}

/* Here are some examples of manipulating properties */

void test_properties()
{
    icalproperty *prop;
    icalparameter *param;
    icalvalue *value;
    char *str;

    icalproperty *clone;

    /* Create a new property */
    prop = icalproperty_vanew_comment(
        "Another Comment",
        icalparameter_new_cn("A Common Name 1"),
        icalparameter_new_cn("A Common Name 2"),
        icalparameter_new_cn("A Common Name 3"),
        icalparameter_new_cn("A Common Name 4"),
        0);

    /* Iterate through all of the parameters in the property */
    for(param = icalproperty_get_first_parameter(prop,ICAL_ANY_PARAMETER);
        param != 0;
        param = icalproperty_get_next_parameter(prop,ICAL_ANY_PARAMETER)) {

        printf("Prop parameter: %s\n",icalparameter_get_cn(param));
    }

    /* Get a string representation of the property's value */
    printf("Prop value: %s\n",icalproperty_get_comment(prop));

    /* Spit out the property in its RFC 5545 representation */
    str = icalproperty_as_ical_string_r(prop);
    printf("As iCAL string:\n %s\n", str);
    free(str);

    /* Make a copy of the property. Caller owns the memory */
    clone = icalproperty_new_clone(prop);

    /* Get a reference to the value within the clone property */
    value = icalproperty_get_value(clone);

    str = icalvalue_as_ical_string_r(value);
    printf("Value: %s", str);
    free(str);

    /* Frees the original and the clone */
    icalproperty_free(clone);
    icalproperty_free(prop);

}
