#include <pctl.h>
#include <stdio.h>

static char buf[BUFSIZ];
#define string_equiv(a, b, c)   (strncmp((a), (b), (c) < strlen((a)) \
                                        ? strlen((a)) : (c)) == 0)

char *default_number = "9,7825742";


void
cmd_activate(argc, argv)
     int  argc;
     char *argv[];
{
  char *name = (char *) NULL;
  char *prog;
  int  status;

  prog = *argv;
  while(*++argv)
    {
      if((**argv != '-') && !name)
	{
	  name = *argv;
	  continue;
	}

      if(!string_equiv(*argv, "-help", 2))
	printf("unknown option \"%s\".\n", *argv);
      printf("usage: %s <name>\n", prog);
      return;
    }

  if((status = pg_activate(name)) != SUCCESS)
    printf("%s\n", error(status));
  else
    printf("%s's pager active.\n", name);
  
  return;
}



void
cmd_addacl(argc, argv)
     int  argc;
     char *argv[];
{
  char *name = (char *) NULL;
  char *prog;

  prog = *argv;
  while(*++argv)
    {
      if((**argv != '-') && !name)
	{
	  name = *argv;
	  continue;
	}

      if(!string_equiv(*argv, "-help", 2))
	printf("unknown option \"%s\".\n", *argv);
      printf("usage: %s <name>\n", prog);
      return;
    }

}



void
cmd_add(argc, argv)
     int  argc;
     char *argv[];
{
  DB   db;
  char *name = (char *) NULL;
  char *prog;
  int  status;

  prog = *argv;
  while(*++argv)
    {
      if((**argv != '-') && !name)
	{
	  name = *argv;
	  continue;
	}

      if(!string_equiv(*argv, "-help", 2))
	printf("unknown option \"%s\".\n", *argv);
      printf("usage: %s <name>\n", prog);
      return;
    }
  bzero(&db, sizeof(db));
  
  if(name)
    if((status = pg_lookup(name, &db)) == SUCCESS)
      {
	printf("entry for %s already exists\n", name);
	return;
      }
  
  bzero(&db, sizeof(db));
  db.name = name;
  if(get_db_info(&db) != SUCCESS)
    {
      printf("request cancelled.\n");
      return;
    }
  if((status = pg_add(name, &db)) != SUCCESS)
    printf("%s\n", error(status));
  else
    printf("%s added.\n", db.name);
}



void
cmd_deactivate(argc, argv)
     int  argc;
     char *argv[];
{
  char *name = (char *) NULL;
  char *prog;
  int  status;

  prog = *argv;
  while(*++argv)
    {
      if((**argv != '-') && !name)
	{
	  name = *argv;
	  continue;
	}

      if(!string_equiv(*argv, "-help", 2))
	printf("unknown option \"%s\".\n", *argv);
      printf("usage: %s <name>\n", prog);
      return;
    }

  if((status = pg_deactivate(name)) != SUCCESS)
    printf("%s\n", error(status));
  else
    printf("pager inactive.\n");
  
  return;
}



void
cmd_delete(argc, argv)
     int  argc;
     char *argv[];
{
  char *name = (char *) NULL;
  char *prog;
  int  status;

  prog = *argv;
  while(*++argv)
    {
      if((**argv != '-') && !name)
	{
	  name = *argv;
	  continue;
	}

      if(!string_equiv(*argv, "-help", 2))
	printf("unknown option \"%s\".\n", *argv);
      printf("usage: %s <name>\n", prog);
      return;
    }

  if((status = pg_delete(name)) != SUCCESS)
    printf("%s\n", error(status));
  else
    printf("%s deleted.\n", name);

  return;
}


void
cmd_delacl(argc, argv)
     int  argc;
     char *argv[];
{
  char *name = (char *) NULL;
  char *prog;

  prog = *argv;
  while(*++argv)
    {
      if((**argv != '-') && !name)
	{
	  name = *argv;
	  continue;
	}

      if(!string_equiv(*argv, "-help", 2))
	printf("unknown option \"%s\".\n", *argv);
      printf("usage: %s <name>\n", prog);
      return;
    }
}


void 
cmd_edit(argc, argv)
     int  argc;
     char *argv[];
{
  DB   db;
  char *name = (char *) NULL;
  char *prog;
  int  status;
  char namebuf[64];

  prog = *argv;
  while(*++argv)
    {
      if((**argv != '-') && !name)
	{
	  name = *argv;
	  continue;
	}

      if(!string_equiv(*argv, "-help", 2))
	printf("unknown option \"%s\".\n", *argv);
      printf("usage: %s <name>\n", prog);
      return;
    }
  bzero(&db, sizeof(db));
  if(!name)
    {
      if(get_input("name", "", namebuf, sizeof(namebuf)) != SUCCESS)
	return;
      name = namebuf;
    }

  if((status = pg_lookup(name, &db)) != SUCCESS)
    {
      printf("%s\n", error(status));
      return;
    }

  if(get_db_info(&db) != SUCCESS)
    {
      printf("request cancelled.\n");
      return;
    }

  if((status = pg_change(name, &db)) != SUCCESS)
    printf("%s\n", error(status));
  else
    printf("%s changed.\n", db.name);  
}




void
cmd_list_acl(argc, argv)
     int  argc;
     char *argv[];
{
  char *name = (char *) NULL;
  char *prog;

  prog = *argv;
  while(*++argv)
    {
      if((**argv != '-') && !name)
	{
	  name = *argv;
	  continue;
	}

      if(!string_equiv(*argv, "-help", 2))
	printf("unknown option \"%s\".\n", *argv);
      printf("usage: %s <name>\n", prog);
      return;
    }

  return;
}



void
cmd_lookup(argc, argv)
     int  argc;
     char *argv[];
{
  DB db;
  int status;
  char *name = (char *) NULL;
  char *prog;

  prog = *argv;
  while(*++argv)
    {
      if((**argv != '-') && !name)
	{
	  name = *argv;
	  continue;
	}

      if(!string_equiv(*argv, "-help", 2))
	printf("unknown option \"%s\".\n", *argv);
      printf("usage: %s <name>\n", prog);
      return;
    }

  bzero(buf, sizeof(buf));
  status = pg_lookup(name, &db, buf, sizeof(buf));
  if(status == SUCCESS)
    {
      printf("name:\t%s\n", db.name);
      printf("type:\t%s\n", db.type == ALPHANUMERIC ? "alphanumeric" :
	     db.type == NUMERIC ? "numeric" : db.type == POINTER ? "pointer" :
	     "");
      if(db.number)
	printf("number:\t%s\n", db.number);
      if(db.pagerid)
	printf("pager:\t%s\n", db.pagerid);
      printf("active:\t%s\n", db.active ? "yes" : "no");
    }
  else
    printf("%s: %s\n", name, error(status));
  return;
}




void
cmd_page(argc, argv)
     int  argc;
     char *argv[];
{
  char *name = (char *) NULL;
  char *prog;

  prog = *argv;
  while(*++argv)
    {
      if((**argv != '-') && !name)
	{
	  name = *argv;
	  continue;
	}

      if(!string_equiv(*argv, "-help", 2))
	printf("unknown option \"%s\".\n", *argv);
      printf("usage: %s <name>\n", prog);
      return;
    }

  return;
}




void
cmd_setmsg(argc, argv)
     int argc;
     char *argv[];
{
  char *name = (char *) NULL;
  char *prog;
  char buf[BUFSIZ];
  int status;

  prog = *argv;
  while(*++argv)
    {
      if((**argv != '-') && !name)
	{
	  name = *argv;
	  continue;
	}

      if(!string_equiv(*argv, "-help", 2))
	printf("unknown option \"%s\".\n", *argv);
      printf("usage: %s <name>\n", prog);
      return;
    }
  
  get_message("Type your message now.  End with control-D or a dot on a line by itself.\n", buf, sizeof(buf));

  if((status = pg_set_msg(name, buf)) != SUCCESS)
    printf("%s\n", error(status));
  else
    printf("new message set.\n");
  return;
}




void
cmd_help(argc, argv)
     int  argc;
     char *argv[];
{
  ss_help(argc, argv);
}




void
cmd_quit()
{
  pg_cleanup();
  ss_quit();
}


int
get_db_info(db)
     DB *db;
{
  static char name[64];
  static char type[64];
  static char number[64];
  static char pager[64];

  if(get_input("name", db->name, name, sizeof(name)) != SUCCESS)
    return(ERROR);
  db->name = name;
  while(get_input("type", db->type == ALPHANUMERIC ? "alphanumeric" :
		  db->type == NUMERIC ? "numeric" :
		  db->type == POINTER ? "pointer" :
		  "", type, sizeof(type)) == SUCCESS)
    {
      if(*type == '?')
	{
	  printf("alphanumeric\nnumeric\npointer\n");
	  continue;
	}
      
      if(string_equiv(type, "alphanumeric", 1))
	{
	  db->type = ALPHANUMERIC;
	  break;
	}
      
      if(string_equiv(type, "numeric", 1))
	{
	  db->type = NUMERIC;
	  break;
	}
      
      if(string_equiv(type, "pointer", 1))
	{
	  db->type = POINTER;
	  break;
	}
      printf("unknown type. '?' for list of valid types.\n");
    }
  
  if(db->type != POINTER)
    {
      if(!db->number)
	db->number = default_number;
      if(get_input("number", db->number, number, sizeof(number)) == SUCCESS)
	db->number = number;
      else
	return(ERROR);
      if(get_input("pager", db->pagerid, pager, sizeof(pager)) == SUCCESS)
	db->pagerid = pager;
      else
	return(ERROR);
    }
  else
    {
      if(get_input("pointer", db->pagerid, pager, sizeof(pager)) == SUCCESS)
	db->pagerid = pager;
      else
	return(ERROR);
    }
  return(SUCCESS);
}


int
get_message(prompt, message, len)
     char *prompt;
     char *message;
     int  len;
{
  char buf[BUFSIZ];
  int i = 0;

  if(isatty(0))
    printf("%s", prompt);

  while(1)
    {
      if(fgets(buf, sizeof(buf), stdin) == (char *) NULL)
          return(SUCCESS);

      if((*buf == '.') && ((*(buf+1) == '\n') || (*(buf+1) == '\0')))
        break;
      if((i += strlen(buf)) > len-1)
        break;
      buf[strlen(buf) - 1] = '\r';
      strcat(message, buf);
    }

  return(SUCCESS);
}



int
get_input(prompt, def, message, len)
     char *prompt;
     char *def;
     char *message;
     int  len;
{
  char buf[BUFSIZ];
  
  if(def && *def)
    printf("%s [%s]: ", prompt, def);
  else
    printf("%s: ", prompt);

  *buf = '\0';
  if((fgets(buf, sizeof(buf), stdin) == (char *) NULL) || (*buf == '\n'))
    {
      if(def)
	{
	  strncpy(message, def, len);
	  return(SUCCESS);
	}
      else
	return(ERROR);
    }
  
  buf[strlen(buf) - 1] = '\0';
  strncpy(message, buf, len);
  printf("%s\n", buf);
  return(SUCCESS);
}


