/****************************************************************************
 * Copyright 2018-2023,2024 Thomas E. Dickey                                *
 *                                                                          *
 * Permission is hereby granted, free of charge, to any person obtaining a  *
 * copy of this software and associated documentation files (the            *
 * "Software"), to deal in the Software without restriction, including      *
 * without limitation the rights to use, copy, modify, merge, publish,      *
 * distribute, distribute with modifications, sublicense, and/or sell       *
 * copies of the Software, and to permit persons to whom the Software is    *
 * furnished to do so, subject to the following conditions:                 *
 *                                                                          *
 * The above copyright notice and this permission notice shall be included  *
 * in all copies or substantial portions of the Software.                   *
 *                                                                          *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
 *                                                                          *
 * Except as contained in this notice, the name(s) of the above copyright   *
 * holders shall not be used in advertising or otherwise to promote the     *
 * sale, use or other dealings in this Software without prior written       *
 * authorization.                                                           *
 ****************************************************************************/
/*
 * $Id: dump_window.c,v 1.6 2024/12/07 23:03:07 tom Exp $
 */
#include <dump_window.h>

static FILE *dumpfp;

int
open_dump(const char *fn)
{
    int result = 0;
    close_dump();
    if ((dumpfp = fopen(fn, "a")) != NULL)
	result = 1;
    return result;
}

void
close_dump(void)
{
    if (dumpfp != NULL) {
	fclose(dumpfp);
	dumpfp = NULL;
    }
}

void
dump_window(WINDOW *w)
{
    wgetch(w);
    if (dumpfp != NULL) {
	int y, x;
	int oldy, oldx;
	int maxy, maxx;
	int pass;
	char *cvec = NULL;
	char *avec = NULL;
	char *pvec = NULL;
	int ccnt = 0;
	int acnt = 0;
	int pcnt = 0;
	int endy = -1;
	int endx = -1;

	fprintf(dumpfp, "Window %p\n", (void *) w);

	getyx(w, oldy, oldx);
	getmaxyx(w, maxy, maxx);
	fprintf(dumpfp, "size     (%dx%d)\n", maxy, maxx);
	getbegyx(w, y, x);
	fprintf(dumpfp, "begin    (%dx%d)\n", maxy, maxx);
	getyx(w, y, x);
	fprintf(dumpfp, "position (%d,%d)\n", y, x);

	if (maxy > 0 && maxx > 0) {
	    for (pass = 0; pass < 2; ++pass) {
		for (y = 0; y < maxy; ++y) {

		    if (cvec)
			memset(cvec, 0, (size_t) maxx + 1);
		    if (avec)
			memset(avec, 0, (size_t) maxx + 1);
		    if (pvec)
			memset(pvec, 0, (size_t) maxx + 1);

		    for (x = 0; x < maxx; ++x) {
			chtype data = mvwinch(w, y, x);
			chtype temp;
			char cc = (char) ((data & 0xff) ? (data & 0xff) : ' ');
			char aa;
			char pp;

			temp = ((data & A_ATTRIBUTES) & (chtype) (~A_COLOR));
			if (temp) {
			    if (temp & A_ALTCHARSET) {
				aa = (temp & A_BOLD) ? 'A' : 'a';
			    } else if (temp & A_STANDOUT) {
				aa = (temp & A_BOLD) ? 'S' : 's';
			    } else if (temp & A_REVERSE) {
				aa = (temp & A_BOLD) ? 'R' : 'r';
			    } else if (temp & A_UNDERLINE) {
				aa = (temp & A_BOLD) ? 'U' : 'u';
			    } else {
				aa = (temp & A_BOLD) ? 'b' : '?';
			    }
			} else {
			    aa = ' ';
			}
			if (data & A_COLOR) {
			    if (PAIR_NUMBER((int) data) < 8) {
				pp = (char) ('0' + PAIR_NUMBER((int) data));
			    } else {
				pp = '*';
			    }
			} else {
			    pp = ' ';
			}

			if (pass) {
			    if (cvec)
				cvec[x] = cc;
			    if (avec)
				avec[x] = aa;
			    if (pvec)
				pvec[x] = pp;
			} else {
			    if (cc != ' ' || aa != ' ' || pp != ' ') {
				if (endx < x)
				    endx = x;
				if (endy < y)
				    endy = y;
			    }
			    ccnt += (cc != ' ');
			    acnt += (aa != ' ');
			    pcnt += (pp != ' ');
			}
		    }
		    if (pass) {
			fprintf(dumpfp, "%3d", y + 1);
			if (cvec)
			    fprintf(dumpfp, "\tc|%.*s|\n", maxx, cvec);
			if (avec)
			    fprintf(dumpfp, "\ta|%.*s|\n", maxx, avec);
			if (pvec)
			    fprintf(dumpfp, "\tp|%.*s|\n", maxx, pvec);
		    }
		}
		if (pass) {
		    free(cvec);
		    free(avec);
		    free(pvec);
		} else {
		    fprintf(dumpfp, "%d cells with characters\n", ccnt);
		    fprintf(dumpfp, "%d cells with video-attributes\n", acnt);
		    fprintf(dumpfp, "%d cells with color-attributes\n", pcnt);
		    if (endy < 0 || endx < 0)
			break;
		    /* reduce the dump a little, ignore really blank cells */
		    maxx = endx + 1;
		    maxy = endy + 1;
		    if (ccnt)
			cvec = malloc((size_t) maxx + 1);
		    if (acnt)
			avec = malloc((size_t) maxx + 1);
		    if (pcnt)
			pvec = malloc((size_t) maxx + 1);
		}
	    }
	}
	wmove(w, oldy, oldx);
    }
}
