/*
 * Copyright © 2012  Google, Inc.
 *
 *  This is part of HarfBuzz, a text shaping library.
 *
 * Permission is hereby granted, without written agreement and without
 * license or royalty fees, to use, copy, modify, and distribute this
 * software and its documentation for any purpose, provided that the
 * above copyright notice and the following two paragraphs appear in
 * all copies of this software.
 *
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 *
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 *
 * Google Author(s): Behdad Esfahbod
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "ansi-print.hh"

#include <assert.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <fcntl.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h> /* for isatty() */
#endif

#define MIN(a,b) ((a) < (b) ? (a) : (b))

#define CELL_W 8
#define CELL_H (2 * CELL_W)

struct color_diff_t
{
  int dot (const color_diff_t &o)
  { return v[0]*o.v[0] + v[1]*o.v[1] + v[2]*o.v[2] + v[3]*o.v[3]; }

  int v[4];
};

struct color_t
{
  static color_t from_ansi (unsigned int x)
  {
    color_t c = {(0xFF<<24) | ((0xFF*(x&1))<<16) | ((0xFF*((x >> 1)&1))<<8) | (0xFF*((x >> 2)&1))};
    return c;
  }
  unsigned int to_ansi (void)
  {
    return ((v >> 23) & 1) | ((v >> 14)&2) | ((v >> 5)&4);
  }

  color_diff_t diff (const color_t &o)
  {
    color_diff_t d;
    for (unsigned int i = 0; i < 4; i++)
      d.v[i] = (int) ((v >> (i*8))&0xFF) - (int) ((o.v >> (i*8))&0xFF);
    return d;
  }

  uint32_t v;
};

struct image_t
{
  public:

  image_t (unsigned int width_,
	   unsigned int height_,
	   const uint32_t *data_,
	   unsigned int stride_) :
		width (width_),
		height (height_),
		own_data (false),
		data ((color_t *) data_),
		stride (stride_) {}
  image_t (unsigned int width_,
	   unsigned int height_) :
		width (width_),
		height (height_),
		own_data (true),
		data ((color_t *) malloc (sizeof (data[0]) * width * height)),
		stride (width) {}
  ~image_t (void)
  { if (own_data) free (data); }

  color_t &operator () (unsigned int x, unsigned int y)
  { return data[x + y * stride]; }

  color_t operator () (unsigned int x, unsigned int y) const
  { return data[x + y * stride]; }

  void
  copy_sub_image (const image_t &s,
		  unsigned int x, unsigned int y,
		  unsigned int w, unsigned int h)
  {
    assert (x < width);
    assert (y < height);
    for (unsigned int row = 0; row < h; row++) {
      color_t *p = data + x + MIN (y + row, height - 1) * stride;
      color_t *q = s.data + row * s.stride;
      if (x + w <= width)
	for (unsigned int col = 0; col < w; col++)
	  *q++ = *p++;
      else {
        unsigned int limit = width - x;
	for (unsigned int col = 0; col < limit; col++)
	  *q++ = *p++;
	p--;
	for (unsigned int col = limit; col < w; col++)
	  *q++ = *p;
      }
    }
  }

  const unsigned int width;
  const unsigned int height;

  private:
  bool own_data;
  color_t * const data;
  const unsigned int stride;
};

struct biimage_t
{
  public:

  biimage_t (unsigned int width, unsigned int height) :
		width (width),
		height (height),
		data ((uint8_t *) malloc (sizeof (data[0]) * width * height)) {}
  ~biimage_t (void)
  { free (data); }

  void set (const image_t &image)
  {
    assert (image.width == width);
    assert (image.height == height);
    int freq[8] = {0};
    for (unsigned int y = 0; y < height; y++)
      for (unsigned int x = 0; x < width; x++) {
        color_t c = image (x, y);
        freq[c.to_ansi ()]++;
      }
    bg = 0;
    for (unsigned int i = 1; i < 8; i++)
      if (freq[bg] < freq[i])
        bg = i;
    fg = 0;
    for (unsigned int i = 1; i < 8; i++)
      if (i != bg && freq[fg] < freq[i])
        fg = i;
    if (fg == bg || freq[fg] == 0) {
      fg = bg;
      unicolor = true;
    }
    else
      unicolor = false;

    /* Set the data... */

    if (unicolor) {
      memset (data, 0, sizeof (data[0]) * width * height);
      return;
    }

    color_t bgc = color_t::from_ansi (bg);
    color_t fgc = color_t::from_ansi (fg);
    color_diff_t diff = fgc.diff (bgc);
    int dd = diff.dot (diff);
    for (unsigned int y = 0; y < height; y++)
      for (unsigned int x = 0; x < width; x++) {
        int d = diff.dot (image (x, y).diff (bgc));
	(*this)(x, y) = d < 0 ? 0 : d > dd ? 255 : lround (d * 255. / dd);
      }
  }

  uint8_t &operator () (unsigned int x, unsigned int y)
  { return data[x + y * width]; }

  uint8_t operator () (unsigned int x, unsigned int y) const
  { return data[x + y * width]; }

  const unsigned int width;
  const unsigned int height;
  unsigned int bg;
  unsigned int fg;
  bool unicolor;

  private:
  uint8_t * const data;
};

const char *
block_best (const biimage_t &bi, unsigned int *score, bool *inverse)
{
  unsigned int row_sum[bi.height];
  unsigned int col_sum[bi.width];
  unsigned int row_sum_i[bi.height];
  unsigned int col_sum_i[bi.width];

  for (unsigned int i = 0; i < bi.height; i++)
    row_sum[i] = row_sum_i[i] = 0;
  for (unsigned int i = 0; i < bi.width;  i++)
    col_sum[i] = col_sum_i[i] = 0;

  unsigned int total = 0;
  unsigned int total_i = 0;
  unsigned int quad[2][2] = {{0}};
  unsigned int quad_i[2][2] = {{0}};
  for (unsigned int y = 0; y < bi.height; y++)
    for (unsigned int x = 0; x < bi.width; x++) {
      unsigned int c = bi (x, y);
      row_sum[y] += c;
      col_sum[x] += c;
      quad[2 * y / bi.height][2 * x / bi.width] += c;
      quad_i[2 * y / bi.height][2 * x / bi.width] += 255 - c;
      total += c;
      total_i += 255 - c;
    }
  for (unsigned int i = 0; i < bi.height; i++)
    row_sum_i[i] = 255 * bi.width - row_sum[i];
  for (unsigned int i = 0; i < bi.width; i++)
    col_sum_i[i] = 255 * bi.height - col_sum[i];

  /* Make the sums cummulative */
  for (unsigned int i = 1; i < bi.height; i++) {
    row_sum[i] += row_sum[i - 1];
    row_sum_i[i] += row_sum_i[i - 1];
  }
  for (unsigned int i = 1; i < bi.width;  i++) {
    col_sum[i] += col_sum[i - 1];
    col_sum_i[i] += col_sum_i[i - 1];
  }

  const char *best_c = " ";

  /* Maybe empty is better! */
  if (total < *score) {
    *score = total;
    *inverse = false;
    best_c = " ";
  }
  /* Maybe full is better! */
  if (total_i < *score) {
    *score = total_i;
    *inverse = true;
    best_c = " ";
  }

  /* Find best lower line */
  if (1) {
    unsigned int best_s = (unsigned int) -1;
    bool best_inv = false;
    int best_i = 0;
    for (unsigned int i = 0; i < bi.height - 1; i++)
    {
      unsigned int s;
      s = row_sum[i] + total_i - row_sum_i[i];
      if (s < best_s) {
        best_s = s;
	best_i = i;
	best_inv = false;
      }
      s = row_sum_i[i] + total - row_sum[i];
      if (s < best_s) {
        best_s = s;
	best_i = i;
	best_inv = true;
      }
    }
    if (best_s < *score) {
      static const char *lower[7] = {"▁", "▂", "▃", "▄", "▅", "▆", "▇"};
      unsigned int which = lround (((best_i + 1) * 8) / bi.height);
      if (1 <= which && which <= 7) {
	*score = best_s;
	*inverse = best_inv;
	best_c = lower[7 - which];
      }
    }
  }

  /* Find best left line */
  if (1) {
    unsigned int best_s = (unsigned int) -1;
    bool best_inv = false;
    int best_i = 0;
    for (unsigned int i = 0; i < bi.width - 1; i++)
    {
      unsigned int s;
      s = col_sum[i] + total_i - col_sum_i[i];
      if (s < best_s) {
        best_s = s;
	best_i = i;
	best_inv = true;
      }
      s = col_sum_i[i] + total - col_sum[i];
      if (s < best_s) {
        best_s = s;
	best_i = i;
	best_inv = false;
      }
    }
    if (best_s < *score) {
      static const char *left [7] = {"▏", "▎", "▍", "▌", "▋", "▊", "▉"};
      unsigned int which = lround (((best_i + 1) * 8) / bi.width);
      if (1 <= which && which <= 7) {
	*score = best_s;
	*inverse = best_inv;
	best_c = left[which - 1];
      }
    }
  }

  /* Find best quadrant */
  if (1) {
    unsigned int q = 0;
    unsigned int qs = 0;
    for (unsigned int i = 0; i < 2; i++)
      for (unsigned int j = 0; j < 2; j++)
	if (quad[i][j] > quad_i[i][j]) {
	  q += 1 << (2 * i + j);
	  qs += quad_i[i][j];
	} else
	  qs += quad[i][j];
    if (qs < *score) {
      const char *c = NULL;
      bool inv = false;
      switch (q) {
	case 1:  c = "▟"; inv = true;  break;
	case 2:  c = "▙"; inv = true;  break;
	case 4:  c = "▖"; inv = false; break;
	case 8:  c = "▗"; inv = false; break;
	case 9:  c = "▚"; inv = false; break;
	case 6:  c = "▞"; inv = false; break;
	case 7:  c = "▜"; inv = true;  break;
	case 11: c = "▜"; inv = true;  break;
	case 13: c = "▙"; inv = true;  break;
	case 14: c = "▟"; inv = true;  break;
      }
      if (c) {
	*score = qs;
	*inverse = inv;
	best_c = c;
      }
    }
  }

  return best_c;
}

void
ansi_print_image_rgb24 (const uint32_t *data,
			unsigned int width,
			unsigned int height,
			unsigned int stride)
{
  image_t image (width, height, data, stride);

  unsigned int rows = (height + CELL_H - 1) / CELL_H;
  unsigned int cols = (width +  CELL_W - 1) / CELL_W;
  image_t cell (CELL_W, CELL_H);
  biimage_t bi (CELL_W, CELL_H);
  unsigned int last_bg = -1, last_fg = -1;
  for (unsigned int row = 0; row < rows; row++) {
    for (unsigned int col = 0; col < cols; col++) {
      image.copy_sub_image (cell, col * CELL_W, row * CELL_H, CELL_W, CELL_H);
      bi.set (cell);
      if (bi.unicolor) {
        if (last_bg != bi.bg) {
	  printf ("\e[%dm", 40 + bi.bg);
	  last_bg = bi.bg;
	}
	printf (" ");
      } else {
        /* Figure out the closest character to the biimage */
        unsigned int score = (unsigned int) -1;
	bool inverse = false;
        const char *c = block_best (bi, &score, &inverse);
	if (inverse) {
	  if (last_bg != bi.fg || last_fg != bi.bg) {
	    printf ("\e[%d;%dm", 30 + bi.bg, 40 + bi.fg);
	    last_bg = bi.fg;
	    last_fg = bi.bg;
	  }
	} else {
	  if (last_bg != bi.bg || last_fg != bi.fg) {
	    printf ("\e[%d;%dm", 40 + bi.bg, 30 + bi.fg);
	    last_bg = bi.bg;
	    last_fg = bi.fg;
	  }
	}
	printf ("%s", c);
      }
    }
    printf ("\e[0m\n"); /* Reset */
    last_bg = last_fg = -1;
  }
}
