
#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;
}
