#define STB_HERRINGBONE_WANG_TILE_IMPLEMENTATION
#include "stb_herringbone_wang_tile.h"

#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"

//  e 12 1 1 1 1 1 1 4 4

int main(int argc, char **argv)
{
   stbhw_config c = { 0 };
   int w,h, num_colors,i;
   unsigned char *data;

   if (argc == 1)  goto usage;
   if (argc  < 3)  goto error;

   switch (argv[2][0]) {
      case 'c':
         if (argc <  8 || argc > 10)
            goto error;
         num_colors = 4;
         c.is_corner = 1;
         break;

      case 'e':
         if (argc < 10 || argc > 12)
            goto error;
         num_colors = 6;
         c.is_corner = 0;
         break;

      default:
         goto error;
   }

   c.short_side_len = atoi(argv[3]);
   for (i=0; i < num_colors; ++i)
      c.num_color[i] = atoi(argv[4+i]);

   c.num_vary_x = 1;
   c.num_vary_y = 1;

   if (argc > 4+i)
      c.num_vary_x = atoi(argv[4+i]);
   if (argc > 5+i)
      c.num_vary_y = atoi(argv[5+i]);

   stbhw_get_template_size(&c, &w, &h);

   data = (unsigned char *) malloc(w*h*3);

   if (stbhw_make_template(&c, data, w, h, w*3))
      stbi_write_png(argv[1], w, h, 3, data, w*3);
   else
      fprintf(stderr, "Error: %s\n", stbhw_get_last_error());
   return 0;

 error:
   fputs("Invalid command-line arguments\n\n", stderr);
 usage:
   fputs("Usage (see source for corner & edge type definitions):\n\n", stderr);
   fputs("herringbone_generator {outfile} c {sidelen} {c0} {c1} {c2} {c3} [{vx} {vy}]\n"
         "     {outfile}  -- filename that template will be written to as PNG\n"
         "     {sidelen}  -- length of short side of rectangle in pixels\n"
         "     {c0}       -- number of colors for corner type 0\n"
         "     {c1}       -- number of colors for corner type 1\n"
         "     {c2}       -- number of colors for corner type 2\n"
         "     {c3}       -- number of colors for corner type 3\n"
         "     {vx}       -- number of color-duplicating variations horizontally in template\n"
         "     {vy}       -- number of color-duplicating variations vertically in template\n"
         "\n"
         , stderr);
   fputs("herringbone_generator {outfile} e {sidelen} {e0} {e1} {e2} {e3} {e4} {e5} [{vx} {vy}]\n"
         "     {outfile}  -- filename that template will be written to as PNG\n"
         "     {sidelen}  -- length of short side of rectangle in pixels\n"
         "     {e0}       -- number of colors for edge type 0\n"
         "     {e1}       -- number of colors for edge type 1\n"
         "     {e2}       -- number of colors for edge type 2\n"
         "     {e3}       -- number of colors for edge type 3\n"
         "     {e4}       -- number of colors for edge type 4\n"
         "     {e5}       -- number of colors for edge type 5\n"
         "     {vx}       -- number of color-duplicating variations horizontally in template\n"
         "     {vy}       -- number of color-duplicating variations vertically in template\n"
         , stderr);
   return 1;
}