#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

#include "http_parser.h"

#define MAX_DATA 1024

int on_message_begin(http_parser *parser)
{
  printf("on_message_begin\n");
  return 0;
}

int on_url(http_parser *parser, const char *data, size_t length)
{
  printf("on_url\n");
  return 0;
}

int on_status_complete(http_parser *parser)
{
  printf("on_status_complete\n");
  return 0;
}

int on_header_field(http_parser *parser, const char *data, size_t length)
{
  printf("on_header_field\n");
  return 0;
}

int on_header_value(http_parser *parser, const char *data, size_t length)
{
  printf("on_header_value\n");
  return 0;
}

int on_headers_complete(http_parser *parser)
{
  printf("on_headers_complete\n");
  return 0;
}

int on_body(http_parser *parser, const char *data, size_t length)
{
  printf("on_body\n");
  return 0;
}

int on_message_complete(http_parser *parser)
{
  printf("on_message_complete\n");
  return 0;
}


int main(int argc, char *argv[])
{


  if (argc != 2) {
    printf("Usage: %s file\n", argv[0]);
    return 1;
  }

  http_parser_settings settings;

  settings.on_message_begin = on_message_begin;
  settings.on_url = on_url;
  settings.on_status_complete = on_status_complete;
  settings.on_header_field = on_header_field;
  settings.on_header_value = on_header_value;
  settings.on_headers_complete = on_headers_complete;
  settings.on_body = on_body;
  settings.on_message_complete = on_message_complete;


  http_parser *parser = malloc(sizeof(http_parser));
  http_parser_init(parser, HTTP_REQUEST);

  int file;

  if ((file = open(argv[1], O_RDONLY)) == -1) {
    printf("Cannot open file\n");
    return 1;
  }

  size_t n_read;
  char data[MAX_DATA];

  if ((n_read = read(file, &data, MAX_DATA)) == -1) {
    printf("read error\n");
    return 1;
  }

  size_t nparsed;
  nparsed = http_parser_execute(parser, &settings, data, n_read);

  if (nparsed != n_read) {
    printf("parse error\n");
    return 1;
  }

  close(file);
  free(parser);
  return 0;
}