#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <inttypes.h>
#include "utility.h"
#include "hdhomerun_tuner.h"
#include "hdhomerun_http.h"
#include "hdhomerun_dev.h"
#include "sagelog.h"

#define _MIN_(x, y) ((x) > (y) ? (y) : (x))

static int read_elemnt(char *xml, char *tag, char *buf, int size)
{
  char open_tag[256], close_tag[256];
  char *start, *end;
  snprintf(open_tag, sizeof(open_tag), "<%s>", tag);
  snprintf(close_tag, sizeof(open_tag), "</%s>", tag);

  start = strstr(xml, open_tag);
  if (start != NULL) {
    start += strlen(open_tag);
    end = strstr(start, close_tag);
    if (end != NULL) {
      int len = _MIN_(end - start, size);
      memcpy(buf, start, len);
      buf[len] = 0;
      end += strlen(close_tag);
      return end - xml;
    }
  }
  return 0;
}

static void html_txt_converison(char *txt)
{
  char *p;
  do {
    // remove &amp;
    p = strstr(txt, "&amp;");
    if (p)
      strcpy(p + 1, p + 1 + 4);
  } while (p);
}

// remove tag and trim space
static void cleanup_txt(char *txt)
{
  int n = strlen(txt);
  while (n > 0) {
    if (txt[n] == ' ' || txt[n] == '<' || txt[n] == '\r' || txt[n] == '\n')
      txt[n] = 0x0;
    n--;
  }
}

static int program_parser(void *context, char *buf, int bytes)
{
  struct vchan_tbl_t *vt = (struct vchan_tbl_t *)context;
  int pos, used_bytes;
  char guide_num[16], guide_name[64];

  pos = 0;
  while (pos < bytes) {
    used_bytes =
        read_elemnt(buf + pos, "GuideNumber", guide_num, sizeof(guide_num));
    if (used_bytes == 0)
      break;
    pos += used_bytes;
    // printf( "%s ", guide_num );
    used_bytes =
        read_elemnt(buf + pos, "GuideName", guide_name, sizeof(guide_name));
    if (used_bytes == 0)
      break;
    html_txt_converison(guide_name);
    if (vt->channel_num >= vt->channel_size)
      grow_vhcan_tbl(vt);
    if (vt->channel_num < vt->channel_size) {
      int i = vt->channel_num;
      vt->vchan[i].guide_id = atoi(guide_num);
      snprintf(vt->vchan[i].guide_name, sizeof(vt->vchan[i].guide_name),
               "\"%s\"", guide_name);
      vt->channel_num++;
    }
    pos += used_bytes;
    // printf( "%s;\n", guide_name );
  }
  return pos;
}

static int hdhomerun_parser(void *context, char *buf, int bytes)
{
  char *p;
  struct hdhr_tuner_t *ht = (struct hdhr_tuner_t *)context;
  p = strstr(buf, "Model:");
  if (p != NULL) {
    if (strlen(p + 6) < 10)
      return p - buf;
    if (get_string_by_name(p, "Model", ht->model, sizeof(ht->model), NULL)) {
      cleanup_txt(ht->model);
    }
  }

  if (strstr(buf, "CableCARD Menu") != NULL) {
    ht->cc_tuner = 1;
  }
  return bytes;
}

int get_dev_model(struct hdhr_tuner_t *ht)
{
  int ret = parse_http_page(ht->ip, "/", hdhomerun_parser, ht);
  return ret;
}

int get_vchannel_list(struct vchan_tbl_t *vt)
{
  int ret = parse_http_page(vt->ht.ip, "/lineup.xml", program_parser, vt);
  return ret;
}
