#include <string.h>
#include "ps_info.h"
#include "local_proto.h"

#define KEY(x)(strcmp(key,x)==0)

int read_point (double e, double n)
{
    char buf[1024], symb[1024];
    int r, g, b;
    int color_R, color_G, color_B;
    int fcolor_R, fcolor_G, fcolor_B;
    int ret;
    double size;
    int have_icon;
    char *key, *data;
    int masked;

    static char *help[]=
    {
	"color  color",
	"fcolor fill color",
	"symbol group/symbol",
	"size   #",
	"masked [y|n]",
	""
    };

    size = 6.0;
    have_icon = 0;
    masked = 0;
    color_R = color_G = color_B = 0;
    fcolor_R = fcolor_G = fcolor_B = 128;

    while(input(2, buf, help))
    {
	if (!key_data(buf, &key, &data)) continue;

	if (KEY("masked"))
	{
	    masked = yesno(key, data);
	    if (masked) PS.mask_needed = 1;
	    continue;
	}
	if (KEY("color"))
	{
	    ret = G_str_to_color( data, &r, &g, &b);
	    if ( ret == 1 ) {
	        color_R = r;
		color_G = g;
		color_B = b;
	    }
	    else if ( ret == 2 )  /* i.e. "none" */
		color_R = color_G = color_B = -1;
	    else
		error (key,data,"illegal color request");

	    continue;
	}
	if (KEY("fcolor"))
	{
	    ret = G_str_to_color( data, &r, &g, &b);
	    if ( ret == 1 ) {
	        fcolor_R = r;
		fcolor_G = g;
		fcolor_B = b;
	    }
	    else if ( ret == 2 )  /* i.e. "none" */
		fcolor_R = fcolor_G = fcolor_B = -1;
	    else
		error (key,data,"illegal color request");

	    continue;
	}
	if (KEY("symbol"))
	{
	    /* TODO: check if exists */
	    strcpy (symb, data);
	    continue;
	}

	if (KEY("size"))
	{
	    if (sscanf(data, "%lf", &size) != 1 || size <= 0.0)
	    {
		size = 1.0;
		error(key, data, "illegal size request");
	    }
	    continue;
	}

	error(key, data, "illegal point request");
    }

    sprintf(buf, "P %d %f %f %d %d %d %d %d %d %f %s", masked, e, n, 
	color_R, color_G, color_B, fcolor_R, fcolor_G, fcolor_B, size, symb);

    add_to_plfile(buf);

    return 0;
}

int read_eps (double e, double n)
{
    char buf[1024];
    char *eps;
    double scale, rotate;
    int have_eps;
    char *key, *data;
    int masked;
    FILE *fp;

    static char *help[]=
    {
	"epsfile EPS file",
	"scale   #",
	"rotate   #",	
	"masked [y|n]",
	""
    };

    scale = 1.0;
    rotate = 0.0;
    have_eps = 0;    
    masked = 0;

    while(input(2, buf, help))
    {
	if (!key_data(buf, &key, &data)) continue;

	if (KEY("masked"))
	{
	    masked = yesno(key, data);
	    if (masked) PS.mask_needed = 1;
	    continue;
	}

	if (KEY("epsfile"))
	{
	    G_chop(data);
	    eps = G_store(data);
	    /* test if file is accessible */
	    if ((fp = fopen(eps, "r")) == NULL)
	    { 
		fprintf (stderr,"Can't open eps file <%s>\n", eps);
		return (0);
	    }
	    have_eps = 1;
	    fclose (fp);	
	    continue;
	}

	if (KEY("scale"))
	{
	    if (sscanf(data, "%lf", &scale) != 1 || scale <= 0.0)
	    {
		scale = 1.0;
		error(key, data, "illegal scale request");
	    }
	    continue;
	}

	if (KEY("rotate"))
	{
	    if (sscanf(data, "%lf", &rotate) != 1 )
	    {
		rotate = 0.0;
		error(key, data, "illegal rotate request");
	    }
	    continue;
	}

	error(key, data, "illegal eps request");
    }
    if (have_eps) 
    { 
	sprintf(buf, "E %d %f %f %f %f %s", masked, e, n, scale, rotate, eps);
    }
    add_to_plfile(buf);

    return 0;
}

int read_line (double e1, double n1, double e2, double n2)
{
    char buf[300];
    int r,g,b;
    int color_R, color_G, color_B;
    int ret;
    double width;
    int masked;
    char ch, *key, *data;

    static char *help[]=
    {
	"color  color",
	"width  #",
	"masked [y|n]",
	""
    };

    width = 1.;
    color_R = color_G = color_B = 0;
    masked = 0;

    while(input(2, buf, help))
    {
	if (!key_data(buf, &key, &data)) continue;

	if (KEY("masked"))
	{
	    masked = yesno(key, data);
	    if (masked) PS.mask_needed = 1;
	    continue;
	}

	if (KEY("color"))
	{
	    ret = G_str_to_color( data, &r, &g, &b);
	    if ( ret == 1 ) {
	        color_R = r;
		color_G = g;
		color_B = b;
	    }
	    else if ( ret == 2 )  /* i.e. "none" */
		color_R = color_G = color_B = -1;
	    else
		error (key,data,"illegal color request");

	    continue;
	}

	if (KEY("width"))
	{
	    ch = ' ';
	    if (sscanf(data, "%lf%c", &width , &ch) < 1 || width < 0.)
	    {
		width = 1.;
		error(key, data, "illegal width request");
	    }
	    if(ch=='i') width = width/72.;
	    continue;
	}

	error(key, data, "illegal line request");
    }

    sprintf(buf, "L %d %f %f %f %f %d %d %d %.8f",
	masked, e1, n1, e2, n2, color_R, color_G, color_B, width);

    add_to_plfile(buf);

    return 0;
}

int read_rectangle (double e1, double n1, double e2, double n2)
{
    char buf[300];
    int r, g, b;
    int color_R, color_G, color_B;
    int fcolor_R, fcolor_G, fcolor_B;
    int ret;
    double width;
    int masked;
    char ch, *key, *data;

    static char *help[]=
    {
	"color  color",
	"fcolor fill color",	
	"width  #",
	"masked [y|n]",
	""
    };

    width = 1.;
    masked = 0;
    color_R = color_G = color_B = 0;
    fcolor_R = fcolor_G = fcolor_B = -1;  /* not filled by default */

    while(input(2, buf, help))
    {
	if (!key_data(buf, &key, &data)) continue;

	if (KEY("masked"))
	{
	    masked = yesno(key, data);
	    if (masked) PS.mask_needed = 1;
	    continue;
	}

	if (KEY("color"))
	{
	    ret = G_str_to_color( data, &r, &g, &b);
	    if ( ret == 1 ) {
	        color_R = r;
		color_G = g;
		color_B = b;
	    }
	    else if ( ret == 2 )  /* i.e. "none" */
		color_R = color_G = color_B = -1;
	    else
		error (key,data,"illegal color request");

	    continue;
	}

	if (KEY("fcolor"))
	{
	    ret = G_str_to_color( data, &r, &g, &b);
	    if ( ret == 1 ) {
	        fcolor_R = r;
		fcolor_G = g;
		fcolor_B = b;
	    }
	    else if ( ret == 2 )  /* i.e. "none" */
		fcolor_R = fcolor_G = fcolor_B = -1;
	    else
		error (key,data,"illegal color request");

	    continue;
	}	

	if (KEY("width"))
	{
	    ch = ' ';
	    if (sscanf(data, "%lf%c", &width , &ch) < 1 || width < 0.)
	    {
		width = 1.;
		error(key, data, "illegal width request");
	    }
	    if(ch=='i') width = width/72.;
	    continue;
	}

	error(key, data, "illegal rectangle request");
    }

    sprintf(buf, "R %d %f %f %f %f %d %d %d %d %d %d %.8f",
	masked, e1, n1, e2, n2, color_R, color_G, color_B, 
		fcolor_R, fcolor_G, fcolor_B, width);

    add_to_plfile(buf);

    return 0;
}

int add_to_plfile (char *buf)
{
    FILE *fd;

    if (PS.plfile == NULL)
    {	
	PS.plfile = G_tempfile();
	fd = fopen(PS.plfile, "w");
    }
    else fd = fopen(PS.plfile, "a");
    if (fd != NULL)
    {
	fprintf(fd, "%s\n", buf);
	fclose(fd);
    }
    else error("point/line file", "", "can't open");

    return 0;
}
