#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

