#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <assert.h>

#include <feed/feed.h>

int main(int argc, char *argv[]) {
  char errbuf[BUFSIZ];
  FeedParser *parser;
  FeedError feed_err;
  Feed *feed;
  FeedRSS20Feed *rss;
  int i, max;

  /* check command-line arguments */
  if (argc < 2) {
    assert(fprintf(stderr, "FATAL: Missing feed filename.\n") > 0);
    exit(EXIT_FAILURE);
  }
  
  /* allocate new feed parser */
  if ((parser = feed_parser_new()) == NULL) {
    assert(fprintf(stderr, "FATAL: Couldn't allocate feed parser: %s.\n", (!strerror_r(errno, errbuf, sizeof(errbuf))) ? errbuf : "Unknown error") > 0);
    exit(EXIT_FAILURE);
  }
  
  /* load feed from file */
  if ((feed_err = feed_parser_parse_file(parser, argv[1], &feed)) != FEED_ERR_OK) {
    assert(fprintf(stderr, "FATAL: Couldn't read input file \"%s\": %s.\n", argv[1], (feed_strerror(feed_err, errbuf, sizeof(errbuf)) == FEED_ERR_OK) ? errbuf : "Unknown error") > 0);
    exit(EXIT_FAILURE);
  }
  
  /* free feed parser */
  if ((feed_err = feed_parser_free(parser)) != FEED_ERR_OK) {
    assert(fprintf(stderr, "WARNING: Couldn't free feed parser: %s.\n", (feed_strerror(feed_err, errbuf, sizeof(errbuf)) == FEED_ERR_OK) ? errbuf : "Unknown error") > 0);
  }
  

  /****************************/
  /* do stuff with input feed */
  /****************************/

  /* set up convenience cast */
  rss = FEED_RSS20_FEED(feed);
  
  /* print out some feed information */
  printf("feed type: %d\n", feed->type);
  printf("feed title: %s\n", rss->channel.title);
  printf("num items: %d\n", rss->num_items);

  /* iterate over top 10 item */
  max = (10 < rss->num_items) ? 10 : rss->num_items;
  for (i = 0; i < max; i++)
    printf("item[%d]: %s\n", i, (rss->items[i] && rss->items[i]->title) ? rss->items[i]->title : "");
  
  /* free feed object */
  feed_feed_free(feed);
  
  /* exit program */
  return EXIT_SUCCESS;
}

