#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include "hdhomerun_http.h"

#define HOST "google.com"
#define PAGE "/"
#define PORT 80
#define USERAGENT "SAGETV 1.0"

#define _MIN_(x, y) ((x) > (y) ? (y) : (x))
static char *get_ip(char *host, char *buf, int size)
{
  struct hostent *hent;
  char *ip = buf;
  memset(ip, 0, size);
  if ((hent = gethostbyname(host)) == NULL) {
    herror("Can't get IP");
    exit(1);
  }
  if (inet_ntop(AF_INET, (void *)hent->h_addr_list[0], ip, size) == NULL) {
    perror("Can't resolve host");
    exit(1);
  }
  return ip;
}

static char *build_get_query(char *host, char *page)
{
  char *query;
  char *getpage = page;
  char *tpl = "GET /%s HTTP/1.0\r\nHost: %s\r\nUser-Agent: %s\r\n\r\n";
  if (getpage[0] == '/') {
    getpage = getpage + 1;
  }
  // -5 is to consider the %s %s %s in tpl and the ending \0
  query = (char *)malloc(strlen(host) + strlen(getpage) + strlen(USERAGENT) +
                         strlen(tpl) - 5);
  sprintf(query, tpl, getpage, host, USERAGENT);
  return query;
}

int parse_http_page(char *host, char *page, parser_f parser, void *context)
{
  struct sockaddr_in *remote;
  int ret;
  char buf[BUFSIZ + 1];
  int sock;
  char *get;
  char ip[32];
  if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
    perror("Can't create TCP socket");
    return -1;
  }

  get_ip(host, ip, sizeof(ip));
  remote = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in *));
  remote->sin_family = AF_INET;
  ret = inet_pton(AF_INET, ip, (void *)(&(remote->sin_addr.s_addr)));
  if (ret < 0) {
    perror("Can't set remote->sin_addr.s_addr");
    return -1;
  } else if (ret == 0) {
    fprintf(stderr, "%s is not a valid IP address\n", ip);
    return -1;
  }
  remote->sin_port = htons(PORT);

  if (connect(sock, (struct sockaddr *)remote, sizeof(struct sockaddr)) < 0) {
    perror("Could not connect");
    return -1;
  }
  get = build_get_query(host, page);

  // send the query to the server
  int sent = 0;
  while (sent < strlen(get)) {
    ret = send(sock, get + sent, strlen(get) - sent, 0);
    if (ret == -1) {
      perror("Can't send query");
      break;
    }
    sent += ret;
  }

  // recieve page
  int remain = 0;
  while ((ret = recv(sock, buf + remain, BUFSIZ - remain, 0)) > 0) {
    int used_bytes = 0;
    if (parser != NULL && ret >= 0) {
      *(buf + remain + ret) = 0x0;
      used_bytes = parser(context, buf, ret + remain);
      remain = ret + remain - used_bytes;
      if (remain > 0)
        memcpy(buf, buf + used_bytes, remain);
    }
    if (used_bytes < 0)
      break;
  }
  free(get);
  free(remote);
  close(sock);
  return 1;
}

#ifdef HTTP_GET_APP
static void usage()
{
  fprintf(stderr,
          "USAGE: htmlget host [page]\n\
\thost: the website hostname. ex: coding.debuntu.org\n\
\tpage: the page to retrieve. ex: index.html, default: /\n");
}

static int noop_parser(void *context, char *buf, int bytes)
{
  printf("%s", buf);
  return bytes;
}

int main(int argc, char **argv)
{
  char *host;
  char *page;

  if (argc == 1) {
    usage();
    exit(2);
  }
  host = argv[1];
  if (argc > 2) {
    page = argv[2];
  } else {
    page = PAGE;
  }

  parse_http_page(host, page, noop_parser, NULL);
  return 0;
}

#endif
