#include "env.h"
#include "str.h"
#include "die.h"

/**
 * Copyright (C) 2001-2006 Tino Reichardt
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License Version 2, as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/* global null-terminated variables */
char *mcdp_env_devcdrom;
char *mcdp_env_editor;
char *mcdp_env_mixer;
char *mcdp_env_lang;
char *mcdp_env_username;
char *mcdp_env_hostname;
char *mcdp_env_email;
char *mcdp_env_workmandb;
char *mcdp_env_cddb_path;
char *mcdp_env_cddb_server;
char *mcdp_env_cddb_webserver;
char *mcdp_env_cddb_submit;
char *mcdp_env_http_proxy;
char *mcdp_env_http_proxy_user;
char *mcdp_env_http_proxy_pass;

stralloc c_box;
stralloc c_normal;
stralloc c_status;
stralloc c_description;
stralloc c_headline;
stralloc c_cdname;
stralloc c_tracks;
stralloc c_ctrack;
stralloc c_note;
stralloc c_question;
stralloc c_cddb_send;
stralloc c_cddb_retr;
stralloc c_cddb_fail;

char *unknown="unknown";

/* env_init_sth - initializing some spcific environment variable
 *
 * @param dest  destination stralloc
 * @param env   name of the environment variable
 * @param def   default value
 * @return      nothing
 */
#include "buffer.h"
static void env_init_color(stralloc *dest, char *env, char *def)
{
	char *s, *t;

	stralloc_init(dest);
	t = env_get(env);
	if (t) {
		if (!stralloc_copys(dest, t)) die_nomem();
	} else {
		if (!stralloc_copys(dest, def)) die_nomem();
	}
	dest->s[dest->len]=0;
	s=t=dest->s;

	for (s=t=dest->s; *t; t++, s++) {
		if (*t=='\\') {
			switch (*++t) {
			case 'a':  *s = '\a'; break;
			case 'b':  *s = '\b'; break;
			case 'f':  *s = '\f'; break;
			case 'n':  *s = '\n'; break;
			case 't':  *s = '\t'; break;
			case 'v':  *s = '\v'; break;
			case 'e':  *s = '\033'; break;
			case 'E':  *s = '\033'; break;
			case '\\': *s = '\\'; break;
			}
		} else {
			*s = *t;
		}
	} *s=0; /* terminate new end */
	dest->len=str_len(dest->s); /* set the current length */

	return;
}


/* env_init - initializing of environment variables
 *
 * - read all environment variables which are used by mcdp
 */
void env_init(void)
{
	char *x;
	long l;

	/* path to the cdrom device
	 *
	 * 1: $CDROM
	 * 2: /dev/cdrom
	 */
	x = env_get("CDROM");
	if (!x) {
		mcdp_env_devcdrom=DEFAULT_DEVCDROM;
	} else {
		mcdp_env_devcdrom=x;
	}

	/* editor command
	 *
	 * 1: $EDITOR
	 * 2: vim
	 */
	x = env_get("EDITOR");
	if (!x) {
		mcdp_env_editor=DEFAULT_EDITOR;
	} else {
		mcdp_env_editor=x;
	}

	/* mixer command
	 *
	 * 1: $MIXER
	 * 2: mmix
	 */
	x = env_get("MIXER");
	if (!x) {
		mcdp_env_mixer=DEFAULT_MIXER;
	} else {
		mcdp_env_mixer=x;
	}

	/* language settings
	 *
	 * 1: $LANG
	 * 2: en
	 */
	x = env_get("LANG");
	if (!x) {
		mcdp_env_lang=DEFAULT_LANG;
	} else {
		mcdp_env_lang=x;
	}

	/* username (for the cddb hello command)
	 *
	 * 1: $MCDP_USER
	 * 2: $LOGNAME
	 * 3: unknown
	 */
	x = env_get("MCDP_USER");
	if (!x) { x = env_get("LOGNAME"); }
	if (!x) {
		mcdp_env_username=unknown;
	} else {
		mcdp_env_username=x;
	}

	/* hostname (for the cddb hello command)
	 *
	 * 1: $MCDP_HOST
	 * 2: $HOSTNAME
	 * 3: $HOST
	 * 4: unknown
	 */
	x = env_get("MCDP_HOST");
	if (!x) { x = env_get("HOSTNAME"); }
	if (!x) { x = env_get("HOST"); }
	if (!x) {
		mcdp_env_hostname=unknown;
	} else {
		mcdp_env_hostname=x;
	}

	/* email address for submitting new entries
	 *
	 * 1: $MCDP_EMAIL
	 * 2: $EMAIL
	 * 3: empty
	 */
	x = env_get("MCDP_EMAIL");
	if (!x) { x = env_get("EMAIL"); }
	if (!x) {
		mcdp_env_email=0;
	} else {
		mcdp_env_email=x;
	}

	/* path to the workman database directory
	 *
	 * 1: $WORKMANDB
	 * 2: .workmandb (@ current directory)
	 */
	x = env_get("WORKMANDB");
	if (!x) {
		mcdp_env_workmandb=".workmandb";
	} else {
		mcdp_env_workmandb=x;
	}

	/* path to the cddb database directory
	 *
	 * 1: $CDDB_PATH
	 * 2: .cddb (@ current directory)
	 */
	x = env_get("CDDB_PATH");
	if (!x) {
		mcdp_env_cddb_path="";
	} else {
		mcdp_env_cddb_path=x;
	}

	/* cddb server, "host:port" or "ip:port"
	 *
	 * 1: $CDDB_SERVER
	 * 2: freedb.freedb.org:888
	 */
	x = env_get("CDDB_SERVER");
	if (!x) {
		mcdp_env_cddb_server=DEFAULT_CDDB_SERVER;
	} else {
		mcdp_env_cddb_server=x;
	}

	if (str_start(mcdp_env_cddb_server, "cddbp://")) {
		mcdp_env_cddb_server+=8;
	}

	/* cddb webserver
	 *
	 * 1: $CDDB_WEBSERVER
	 * 2: freedb.org/~cddb/cddb.cgi
	 */
	x = env_get("CDDB_WEBSERVER");
	if (!x) {
		mcdp_env_cddb_webserver=DEFAULT_CDDB_WEBSERVER;
	} else {
		mcdp_env_cddb_webserver=x;
	}

	if (str_start(mcdp_env_cddb_webserver, "http://")) {
		mcdp_env_cddb_webserver+=7;
	}

	/* cddb webserver
	 *
	 * 1: $CDDB_SUBMIT
	 * 2: freedb.org/~cddb/submit.cgi
	 */
	x = env_get("CDDB_SUBMIT");
	if (!x) {
		mcdp_env_cddb_submit=DEFAULT_CDDB_SUBMIT;
	} else {
		mcdp_env_cddb_submit=x;
	}

	if (str_start(mcdp_env_cddb_submit, "http://")) {
		mcdp_env_cddb_submit+=7;
	}

	/* proxy server, for using the cddb webserver behind a firewall
	 * - if we have a user:pass pair, it will be also used
	 *
	 * 1: $HTTP_PROXY
	 * 2: $http_proxy
	 * 3: empty
	 *
	 * sample: "http://user:pass@192.168.1.1:3128/"
	 */
	mcdp_env_http_proxy_user=0;
	mcdp_env_http_proxy_pass=0;
	x = env_get("HTTP_PROXY");
	if (!x) { x = env_get("http_proxy"); }
	if (!x) {
		mcdp_env_http_proxy=0;
	} else {
		/* http://user:pass@host:port */
		if (str_start(x, "http://")) x+=7;

		/* user:pass@host:port */
		mcdp_env_http_proxy=x;

		l = str_chr(x,'@');
		if (x[l] != 0) {
			x[l]=0;
			mcdp_env_http_proxy = x+l+1;
			mcdp_env_http_proxy_user = x;

			/* search for a password */
			l = str_chr(x,':');
			if (x[l] != 0) {
				x[l]=0;
				mcdp_env_http_proxy_pass = x+l+1;
			}
		}
	}

	/* colors */
	env_init_color(&c_box,         "C_BOX",         C_BOX);
	env_init_color(&c_status,      "C_STATUS",      C_STATUS);
	env_init_color(&c_description, "C_DESCRIPTION", C_DESCRIPTION);
	env_init_color(&c_headline,    "C_HEADLINE",    C_HEADLINE);
	env_init_color(&c_cdname,      "C_CDNAME",      C_CDNAME);
	env_init_color(&c_tracks,      "C_TRACKS",      C_TRACKS);
	env_init_color(&c_ctrack,      "C_CTRACK",      C_CTRACK);
	env_init_color(&c_note,        "C_NOTE",        C_NOTE);
	env_init_color(&c_question,    "C_QUESTION",    C_QUESTION);
	env_init_color(&c_cddb_send,   "C_CDDB_SEND",   C_CDDB_SEND);
	env_init_color(&c_cddb_retr,   "C_CDDB_RETR",   C_CDDB_RETR);
	env_init_color(&c_cddb_fail,   "C_CDDB_FAIL",   C_CDDB_FAIL);

	return;
}

