// Copyright 2011 Google Inc. All Rights Reserved.
// Author: qianzhang@google.com (Qiann Zhang)

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <netdb.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>
#include <assert.h>
#include <signal.h>
#include <sys/errno.h>
#include <features.h>
#include <sys/time.h>
#include <math.h>
#include <time.h>
#include <sys/timeb.h>
#include <sys/un.h>
#include <poll.h>
#include <pthread.h>
#include <dirent.h>
#include <dlfcn.h>
#include <stdarg.h>
#include <inttypes.h>
#include "channel_buffer.h"

#define sage_log(x) _sagelog x
void _sagelog(int type, int level, const char *cstr, ...);

static const char *delimiter = " \t,;\r\n:=|'\"#";

static int is_delimiter(char ch)
{
  int i;
  if (ch == 0)
    return 1;
  for (i = 0; delimiter[i]; i++)
    if (ch == delimiter[i])
      return 1;
  return 0;
}

// format name:zzz (or name=zzzz)
int get_string(char *p, const char *name, char *string, int max_len,
               char **next)
{
  char *s, *e;
  e = p;

  while (e != NULL && *e) {
    s = strstr(e, name);
    if (s == NULL)
      return 0;
    // is a token name
    if (((s > p && is_delimiter(*(s - 1))) || s == p) &&
        is_delimiter(*(s + strlen(name)))) {
      s += (int)strlen(name);
      while (*s && (*s == ' ' || *s == '\t')) s++;  // skip white space
      if (*s == '=' || *s == ':') {
        s++;
        while (*s && (*s == ' ' || *s == '\t')) s++;  // skip white space
        if (*s) {
          int i = 0;
          while (i++ < max_len && *s && *s != ' ' && *s != '\t' && *s != '\n' &&
                 *s != '\r')
            *string++ = *s++;

          *string = 0x0;  // terminator
          if (next != NULL) {
            while (*s && *s != ' ' && *s != '\t' && *s != '\n' && *s != '\r')
              s++;
            *next = s;
          }
          return 1;
        }
      }
    }
    e = ++s;
  }
  return 0;
}

// format name:"zzz" (or name="zzzz")
int get_string_with_quote(char *p, const char *name, char *string, int max_len,
                          char **next)
{
  char *s, *e;
  e = p;

  while (e != NULL && *e) {
    s = strstr(e, name);
    if (s == NULL)
      return 0;
    // is a token name
    if (((s > p && is_delimiter(*(s - 1))) || s == p) &&
        is_delimiter(*(s + strlen(name)))) {
      s += (int)strlen(name);
      while (*s && (*s == ' ' || *s == '\t')) s++;  // skip white space
      if (*s == '=' || *s == ':') {
        s++;
        while (*s && (*s == ' ' || *s == '\t')) s++;  // skip white space
        if (*s == '\"') {
          int i = 0;
          s++;
          while (i++ < max_len && *s && *s != '\"') *string++ = *s++;

          *string = 0x0;  // terminator

          if (next != NULL) {
            while (*s && *s != '\"') s++;
            *next = s + 1;
          }
          return 1;
        } else
          return 0;
      }
    }
    e = ++s;
  }
  return 0;
}

int get_string_token(char *p, int num, char *string, int max_len, char **next)
{
  int count = 0;
  char *s;
  s = p;
  if (s == NULL)
    return 0;
  while (*s) {
    while (*s && (*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n'))
      s++;  // skip white space
    if (*s == 0)
      break;

    if (count++ != num) {
      while (*s && !(*s == ' ' || *s == '\t' || *s == ';' || *s == ',' ||
                     *s == '\r' || *s == '\n'))
        s++;  // skip a token
    } else {
      if (*s) {
        int i = 0;
        while (i++ < max_len && *s && !(*s == ' ' || *s == '\t' || *s == ';' ||
                                        *s == ',' || *s == '\r' || *s == '\n'))
          *string++ = *s++;

        *string = 0x0;  // terminator
        if (next != NULL) {
          while (*s && !(*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n'))
            s++;
          *next = s;
        }
        return 1;
      }
    }
    if (*s)
      s++;
  }
  return 0;
}

int get_int_val(char *p, const char *name, int *val, char **next)
{
  char *s, *e;
  e = p;
  while (e != NULL && *e) {
    s = strstr(e, name);
    if (s == NULL)
      return 0;
    // is a token name
    if (((s > p && is_delimiter(*(s - 1))) || s == p) &&
        is_delimiter(*(s + strlen(name)))) {
      s += strlen(name);
      while (*s && (*s == ' ' || *s == '\t')) s++;  // skip white space
      if (*s == '=' || *s == ':') {
        s++;
        while (*s && (*s == ' ' || *s == '\t')) s++;  // skip white space
        if (*s) {
          *val = atoi(s);
          if (*val < 0 && *s == '-')
            s++;
          while (*s >= '0' && *s <= '9') s++;
          if (next != NULL)
            *next = s;
          return 1;
        }
      }
    }
    e = ++s;
  }
  return 0;
}

// format: name val; ext
int get_cfg_val(char *string, char *name, int max_name_lenn, int *Val,
                char *ext, int max_ext_len)
{
  const char *delima = " \t,;\r\n";
  char *token, *saved_ptr;
  if (name == NULL || ext == NULL || max_name_lenn == 0 || max_ext_len == 0)
    return 0;

  name[0] = 0;
  *Val = 0;
  ext[0] = 0;
  ;
  token = (char *)strtok_r(string, delima, &saved_ptr);
  if (token != NULL)
    strncpy(name, token, max_name_lenn);
  token = (char *)strtok_r(saved_ptr, delima, &saved_ptr);
  if (token != NULL) {
    *Val = atoi(token);
    strncpy(ext, token, max_ext_len);
  }
  token = (char *)strtok_r(saved_ptr, delima, &saved_ptr);
  if (token != NULL)
    strncpy(ext, token, max_ext_len);
  return 1;
}

int make_channel_entry_buffer(struct channel_entry_t *ce, char *buf, int size)
{
  int pos = 0;
  pos +=
      snprintf(buf + pos, size - pos, "ch:%03d state:%d ", ce->ch, ce->state);
  if (ce->ctrl_bits)
    pos += snprintf(buf + pos, size - pos, "ctrl:%d ", ce->ctrl_bits);
  if (ce->ch_name[0])
    pos += snprintf(buf + pos, size - pos, "name:%s ", ce->ch_name);
  if (ce->src_ip[0])
    pos += snprintf(buf + pos, size - pos, "ip:%s port:%d ", ce->src_ip,
                    ce->src_port);
  if (ce->epg_id[0])
    pos += snprintf(buf + pos, size - pos, "epg:%s ", ce->epg_id);
  if (ce->dev_name[0])
    pos += snprintf(buf + pos, size - pos, "dev:%s ", ce->dev_name);
  if (ce->dev_tuning[0])
    pos += snprintf(buf + pos, size - pos, "tune:%s ", ce->dev_tuning);
  if (ce->av_inf[0])
    pos += snprintf(buf + pos, size - pos, "av:\"%s\" ", ce->av_inf);
  if (ce->ch_desc[0])
    pos += snprintf(buf + pos, size - pos, "desc:%s ", ce->ch_desc);
  pos += snprintf(buf + pos, size - pos, "\n");
  return pos;
}

int parse_channel_entry_t_buffer(struct channel_entry_t *ce, char *buf)
{
  int item = 0;
  char *p = buf;
  if (!get_int_val(p, "ch", &ce->ch, NULL))
    ce->ch = -1;
  else if (!get_int_val(p, "state", &ce->state, NULL))
    ce->ch = 1;
  else
    item++;
  if (!get_int_val(p, "ctrl", &ce->ctrl_bits, NULL))
    ce->ctrl_bits = 0;
  else
    item++;
  if (!get_string(p, "name", ce->ch_name, sizeof(ce->ch_name) - 1, NULL))
    ce->ch_name[0] = 0x0;
  else
    item++;
  if (!get_string(p, "desc", ce->ch_desc, sizeof(ce->ch_desc) - 1, NULL))
    ce->ch_desc[0] = 0x0;
  else
    item++;
  if (!get_string(p, "ip", ce->src_ip, sizeof(ce->src_ip) - 1, NULL))
    ce->src_ip[0] = 0x0;
  else
    item++;
  if (!get_int_val(p, "port", &ce->src_port, NULL))
    ce->src_port = -1;
  else
    item++;
  if (!get_string(p, "epg", ce->epg_id, sizeof(ce->epg_id) - 1, NULL))
    ce->epg_id[0] = 0x0;
  else
    item++;
  if (!get_string(p, "dev", ce->dev_name, sizeof(ce->dev_name) - 1, NULL))
    ce->dev_name[0] = 0x0;
  else
    item++;
  if (!get_string(p, "tuning", ce->dev_tuning, sizeof(ce->dev_tuning) - 1,
                  NULL))
    ce->dev_tuning[0] = 0x0;
  else
    item++;
  if (!get_string_with_quote(p, "av", ce->av_inf, sizeof(ce->av_inf) - 1, NULL))
    ce->av_inf[0] = 0x0;
  else
    item++;
  if (!get_string_with_quote(p, "desc", ce->ch_desc, sizeof(ce->ch_desc) - 1,
                             NULL))
    ce->ch_desc[0] = 0x0;
  else
    item++;

  return item;
}

struct channel_list_t *create_channel_list(int num)
{
  if (num <= 0)
    return NULL;
  struct channel_list_t *cl = malloc(sizeof(struct channel_list_t));
  if (cl == NULL)
    return NULL;
  cl->num = num;
  cl->channel_num = 0;
  cl->ce = malloc(sizeof(struct channel_entry_t) * num);
  if (cl->ce == NULL) {
    free(cl);
    return NULL;
  }
  memset(cl->ce, 0x0, sizeof(struct channel_entry_t) * num);
  return cl;
}

void release_channel_list(struct channel_list_t *cl)
{
  if (cl) {
    if (cl->ce)
      free(cl->ce);
    free(cl);
  }
}

struct channel_list_t *join_channel_list(struct channel_list_t *cl1,
                                         struct channel_list_t *cl2)
{
  int i, n, channel_num;
  if (cl1 == NULL)
    return cl2;
  if (cl2 == NULL)
    return cl1;

  channel_num = cl1->channel_num + cl2->channel_num;
  if (channel_num < cl1->num) {
    n = 0;
    for (i = cl1->channel_num; i < channel_num; i++) {
      cl1->ce[i] = cl2->ce[n++];
      cl1->ce[i].ch = i;
    }
    cl2->channel_num = channel_num;
    release_channel_list(cl2);
    return cl1;
  } else if (channel_num < cl2->num) {
    n = 0;
    for (i = cl2->channel_num; i < channel_num; i++) {
      cl2->ce[i] = cl1->ce[n++];
      cl2->ce[i].ch = i;
    }
    cl2->channel_num = channel_num;
    release_channel_list(cl1);
    return cl2;
  } else {
    struct channel_list_t *cl = create_channel_list(channel_num);
    for (i = 0; i < cl1->channel_num; i++) {
      cl->ce[i] = cl1->ce[i];
      cl->ce[i].ch = i;
    }
    for (n = 0; n < cl2->channel_num; n++, i++) {
      cl->ce[i] = cl2->ce[n];
      cl->ce[i].ch = i;
    }
    release_channel_list(cl1);
    release_channel_list(cl2);
    cl->channel_num = channel_num;
    return cl;
  }
  return NULL;
}

struct channel_list_t *load_channel_entry(char *file_name)
{
  int item;
  int count = 0;
  char buf[2048] = {0};
  struct channel_list_t *cl;
  FILE *fp;
  fp = fopen(file_name, "r");
  if (fp == NULL) {
    // printf( "Can't open file %s to load channel table, errno:%d\n",
    // file_name, errno );
    return NULL;
  }
  // count entry number
  while (!feof(fp)) {
    char *p = fgets(buf, sizeof(buf) - 1, fp);
    if (p == NULL)
      break;
    if (buf[0] != '#' && strlen(buf) > 4)
      count++;
  }
  fseek(fp, 0, SEEK_SET);
  cl = create_channel_list(count);
  while (!feof(fp) && cl->channel_num < cl->num) {
    char *p = fgets(buf, sizeof(buf) - 1, fp);
    if (p == NULL)
      break;

    // skip comments
    if (buf[0] == '#')
      continue;

    item = parse_channel_entry_t_buffer(&cl->ce[cl->channel_num], buf);
    if (item > 0) {
      cl->channel_num++;
    }
  }
  fclose(fp);
  return cl;
}

int save_channel_entry(char *file_name, struct channel_list_t *cl)
{
  int i;
  char buf[2048];
  FILE *fp;
  if (cl == NULL || cl->channel_num == 0)
    return 0;

  fp = fopen(file_name, "w");
  if (fp == NULL) {
    // printf( "Can't open file %s to save channel table, errno:%d\n",
    // file_name, errno );
    return -1;
  }
  fputs("#Google sagetv channel table ver 1.0., maxium 2048 bytes per line\n",
        fp);
  fprintf(fp, "total_channel:%d\n", cl->channel_num);
  for (i = 0; i < cl->channel_num; i++) {
    make_channel_entry_buffer(&cl->ce[i], buf, sizeof(buf));
    fputs(buf, fp);
  }
  fclose(fp);
  return 1;
}

char *join_alloc_string(char *str1, char *str2)
{
  int len, len1, len2;
  char *str;
  if (str1 == NULL)
    return str2;
  if (str2 == NULL)
    return str1;
  len1 = strlen(str1);
  len2 = strlen(str2);
  len = len1 + len2;
  str = (char *)malloc(len + 1);
  strncpy(str, str1, len1);
  strncpy(str + len1, str2, len2);
  str[len] = 0x0;
  free(str1);
  free(str2);
  return str;
}
