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

