/*
 * Help index test program for CUPS.
 *
 * Copyright © 2020-2024 by OpenPrinting.
 * Copyright © 2007-2017 by Apple Inc.
 * Copyright © 1997-2007 by Easy Software Products.
 *
 * Licensed under Apache License v2.0.  See the file "LICENSE" for more
 * information.
 */

/*
 * Include necessary headers...
 */

#include "cgi.h"


/*
 * Local functions...
 */

static void	list_nodes(const char *title, cups_array_t *nodes);
static int	usage(void);


/*
 * 'main()' - Test the help index code.
 */

int					/* O - Exit status */
main(int  argc,				/* I - Number of command-line arguments */
     char *argv[])			/* I - Command-line arguments */
{
  int		i;			/* Looping var */
  help_index_t	*hi,			/* Help index */
		*search;		/* Search index */
  const char	*opt,			/* Current option character */
		*dir = ".",		/* Directory to index */
		*q = NULL,		/* Query string */
		*section = NULL,	/* Section string */
		*filename = NULL;	/* Filename string */


 /*
  * Parse the command-line...
  */

  for (i = 1; i < argc; i ++)
  {
    if (argv[i][0] == '-')
    {
      if (!strcmp(argv[i], "--help"))
      {
        usage();
        return (0);
      }

      for (opt = argv[i] + 1; *opt; opt ++)
      {
        switch (*opt)
        {
          case 'd' : /* -d directory */
              i ++;
              if (i < argc)
              {
                dir = argv[i];
              }
              else
              {
                fputs("testhi: Missing directory for \"-d\" option.\n", stderr);
                return (usage());
              }
              break;

          case 's' : /* -s section */
              i ++;
              if (i < argc)
              {
                section = argv[i];
              }
              else
              {
                fputs("testhi: Missing section name for \"-s\" option.\n", stderr);
                return (usage());
              }
              break;

          default :
	      fprintf(stderr, "testhi: Unknown option \"-%c\".\n", *opt);
	      return (usage());
        }
      }
    }
    else if (!q)
      q = argv[i];
    else if (!filename)
      filename = argv[i];
    else
    {
      fprintf(stderr, "testhi: Unknown argument \"%s\".\n", argv[i]);
      return (usage());
    }
  }

 /*
  * Load the help index...
  */

  hi = helpLoadIndex("testhi.index", dir);

  list_nodes("nodes", hi->nodes);
  list_nodes("sorted", hi->sorted);

 /*
  * Do any searches...
  */

  if (q)
  {
    search = helpSearchIndex(hi, q, section, filename);

    if (search)
    {
      list_nodes(argv[1], search->sorted);
      helpDeleteIndex(search);
    }
    else
      printf("%s (0 nodes)\n", q);
  }

  helpDeleteIndex(hi);

 /*
  * Return with no errors...
  */

  return (0);
}


/*
 * 'list_nodes()' - List nodes in an array...
 */

static void
list_nodes(const char   *title,		/* I - Title string */
	   cups_array_t *nodes)		/* I - Nodes */
{
  int		i;			/* Looping var */
  help_node_t	*node;			/* Current node */


  printf("%s (%d nodes):\n", title, cupsArrayCount(nodes));
  for (i = 1, node = (help_node_t *)cupsArrayFirst(nodes);
       node;
       i ++, node = (help_node_t *)cupsArrayNext(nodes))
  {
    if (node->anchor)
      printf("    %d: %s#%s \"%s\"", i, node->filename, node->anchor,
             node->text);
    else
      printf("    %d: %s \"%s\"", i, node->filename, node->text);

    printf(" (%d words)\n", cupsArrayCount(node->words));
  }
}


/*
 * 'usage()' - Show program usage.
 */

static int				/* O - Exit status */
usage(void)
{
  puts("Usage: ./testhi [options] [\"query\"] [filename]");
  puts("Options:");
  puts("-d directory      Specify index directory.");
  puts("-s section        Specify search section.");

  return (1);
}
