/**************************************************************************
 *
 * STATUSJSON.H -  Nagios CGI for returning JSON-formatted status data
 *
 * Copyright (c) 2013 Nagios Enterprises, LLC
 * Last Modified: 04-13-2013
 *
 * License:
 *
 * 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.
 *************************************************************************/

#ifndef NAGIOS_STATUSJSON_H_INCLUDED
#define NAGIOS_STATUSJSON_H_INCLUDED

/* Structure containing CGI query string options and values */
typedef struct status_json_cgi_data_struct {
	/* Format options for JSON output */
	unsigned	format_options;
	/* Query being requested */
	int			query;
	/* Index of starting object returned for list requests */
	int			start;
	/* Number of objects returned for list requests */
	int			count;
	/* Return details for each entity in a list request */
	int			details;
	/* strftime format string for time_t values */
	char *		strftime_format;
	/* Name of host whose children should be returned if parenthost is 
		specified */
	char *		parent_host_name;
	/* Use the parent host field or search all hosts*/
	int			use_parent_host;
	/* Host whose children should be returned if use_parent_host is non-zero */
	host *		parent_host;
	/* Name of host whose parents should be returned if childhost is 
		specified */
	char *		child_host_name;
	/* Use the child host field or search all hosts*/
	int			use_child_host;
	/* Host whose parents should be returned if use_child_host is non-zero */
	host *		child_host;
	/* Name of host for which details should be returned */
	char *		host_name;
	/* Host whose host name is host_name */
	host *		host;
	/* The host status selector values */
	unsigned	host_statuses;
	/* Name of hostgroup for which details should be returned */
	char *		hostgroup_name;
	/* Hostgroup whose name is hostgroup_name */
	hostgroup *	hostgroup;
	/* Name of servicegroup for which details should be returned */
	char *		servicegroup_name;
	/* Servicegroup whose name is servicegroup_name */
	servicegroup *	servicegroup;
	/* Name of service for which details should be returned */
	char *		service_description;
	/* Service whose host name is host_name and whose description is 
		service_description*/
	service *	service;
	/* The service status selector values */
	unsigned	service_statuses;
	/* Name of service whose children should be returned if parentservice is
		specified */
	char *		parent_service_name;
	/* Name of service whose parents should be returned if childservice is
		specified */
	char *		child_service_name;
	/* Name of contactgroup for which details should be returned */
	char *		contactgroup_name;
	/* Contactgroup whose name is contactgroup_name */
	contactgroup *	contactgroup;
	/* Name of contact for which details should be returned */
	char *		contact_name;
	/* Contact whose contact name is contact_name */
	contact *	contact;
	/* Name of check timeperiod for which details should be returned */
	char *		check_timeperiod_name;
	/* Timeperiod whose timeperiod name is check_timeperiod_name */
	timeperiod *check_timeperiod;
	/* Name of host notification timeperiod for which details should
			be returned */
	char *		host_notification_timeperiod_name;
	/* Timeperiod whose timeperiod name is host_notification_timeperiod_name */
	timeperiod *host_notification_timeperiod;
	/* Name of service notification timeperiod for which details should
		be returned */
	char *		service_notification_timeperiod_name;
	/* Timeperiod whose timeperiod name is
		service_notification_timeperiod_name */
	timeperiod *service_notification_timeperiod;
	/* Name of check command to be used as a selector */
	char *		check_command_name;
	/* Command whose command name is check_command_name */
	command *	check_command;
	/* Name of event handle to be used as a selector */
	char *		event_handler_name;
	/* Command whose command name is event_handler_name */
	command *	event_handler;
	/* Type(s) of comments to include in comment count and list results */
	unsigned	comment_types;
	/* Entry type(s) of comments to include in comment count and list results */
	unsigned	entry_types;
	/* Persistence(s) of comments to include in comment count and list 
 		results */
	unsigned	persistence;
	/* Whether comments that are expiring, non-expiring, or both are included 
 		in comment count and list results */
	unsigned	expiring;
	/* ID of comment for which details should be returned */
	int			comment_id;
	/* Comment whose id is comment_id */
	nagios_comment *comment;
	/* ID of downtime for which details should be returned */
	int		 	downtime_id;
	/* Downtime whose id is downtime_id */
	scheduled_downtime * downtime;
	/* Start time for time-based queries */
	time_t		start_time;
	/* End time for time-based queries */
	time_t		end_time;
	/* Field on which to base time for hostcount and hostlist queries */
	int			host_time_field;
	/* Field on which to base time for servicecount and servicelist queries */
	int			service_time_field;
	/* Field on which to base time for commentcount and commentlist queries */
	int			comment_time_field;
	/* Field on which to base time for downtimecount and downtimelist queries */
	int			downtime_time_field;
	/* Object type to use for downtimecount and downtimelist queries */
	unsigned	downtime_object_types;
	/* Downtime type to use for downtimecount and downtimelist queries */
	unsigned	downtime_types;
	/* Whether downtimes that are triggered, non-triggered, or both are 
		included in downtime count and list results */
	unsigned	triggered;
	/* ID of a triggering downtime */
	int			triggered_by;
	/* Whether downtimes that are or are not in effect or both are included 
		in downtime count and list results */
	unsigned	in_effect;
	} status_json_cgi_data;

/* Status Type Information */
#define STATUS_QUERY_INVALID				0
#define STATUS_QUERY_HOSTCOUNT				1
#define STATUS_QUERY_HOSTLIST				2
#define STATUS_QUERY_HOST					3
#define STATUS_QUERY_SERVICECOUNT			4
#define STATUS_QUERY_SERVICELIST			5
#define STATUS_QUERY_SERVICE				6
#if 0
#define STATUS_QUERY_CONTACTCOUNT			7
#define STATUS_QUERY_CONTACTLIST			8
#define STATUS_QUERY_CONTACT				9
#endif
#define STATUS_QUERY_COMMENTCOUNT			10
#define STATUS_QUERY_COMMENTLIST			11
#define STATUS_QUERY_COMMENT				12
#define STATUS_QUERY_DOWNTIMECOUNT			13
#define STATUS_QUERY_DOWNTIMELIST			14
#define STATUS_QUERY_DOWNTIME				16
#define STATUS_QUERY_PROGRAMSTATUS			17
#define STATUS_QUERY_PERFORMANCEDATA		18
#define STATUS_QUERY_HELP					19

/* Status Time Fields */
#define STATUS_TIME_INVALID					0
#define STATUS_TIME_LAST_UPDATE				1	/* host, service */
#define STATUS_TIME_LAST_CHECK				2	/* host, service */
#define STATUS_TIME_NEXT_CHECK				3	/* host, service */
#define STATUS_TIME_LAST_STATE_CHANGE		4	/* host, service */
#define STATUS_TIME_LAST_HARD_STATE_CHANGE	5	/* host, service */
#define STATUS_TIME_LAST_TIME_UP			6	/* host */
#define STATUS_TIME_LAST_TIME_DOWN			7	/* host */
#define STATUS_TIME_LAST_TIME_UNREACHABLE	8	/* host */
#define STATUS_TIME_LAST_TIME_OK			9	/* service */
#define STATUS_TIME_LAST_TIME_WARNING		10	/* service */
#define STATUS_TIME_LAST_TIME_CRITICAL		11	/* service */
#define STATUS_TIME_LAST_TIME_UNKNOWN		12	/* service */
#define STATUS_TIME_LAST_NOTIFICATION		13	/* host, service */
#define STATUS_TIME_NEXT_NOTIFICATION		14	/* host, service */
#define STATUS_TIME_ENTRY_TIME				15	/* comment, downtime */
#define STATUS_TIME_EXPIRE_TIME				16	/* comment */
#define STATUS_TIME_START_TIME				17	/* downtime */
#define STATUS_TIME_FLEX_DOWNTIME_START		18	/* downtime */
#define STATUS_TIME_END_TIME				19	/* downtime */

/* Comment Types */
#define COMMENT_TYPE_HOST		1
#define COMMENT_TYPE_SERVICE	2
#define COMMENT_TYPE_ALL 		(COMMENT_TYPE_HOST | COMMENT_TYPE_SERVICE)

/* Comment Entry Types */
#define COMMENT_ENTRY_USER				1
#define COMMENT_ENTRY_DOWNTIME			2
#define COMMENT_ENTRY_FLAPPING			4
#define COMMENT_ENTRY_ACKNOWLEDGEMENT	8
#define COMMENT_ENTRY_ALL				(COMMENT_ENTRY_USER |\
											COMMENT_ENTRY_DOWNTIME |\
											COMMENT_ENTRY_FLAPPING |\
											COMMENT_ENTRY_ACKNOWLEDGEMENT)

/* Downtime Object Types */
#define DOWNTIME_OBJECT_TYPE_HOST		1
#define DOWNTIME_OBJECT_TYPE_SERVICE	2
#define DOWNTIME_OBJECT_TYPE_ALL 		(DOWNTIME_OBJECT_TYPE_HOST |\
											DOWNTIME_OBJECT_TYPE_SERVICE)

/* Downtime Types */
#define DOWNTIME_TYPE_FIXED		1
#define DOWNTIME_TYPE_FLEXIBLE	2
#define DOWNTIME_TYPE_ALL 		(DOWNTIME_TYPE_FIXED | DOWNTIME_TYPE_FLEXIBLE)

extern json_object *json_status_hostcount(unsigned, int, host *, int, host *, 
		hostgroup *, int, contact *, int, time_t, time_t, contactgroup *,
		timeperiod *, timeperiod *, command *, command *);
extern json_object *json_status_hostlist(unsigned, int, int, int, int, host *, 
		int, host *, hostgroup *, int, contact *, int, time_t, time_t,
		contactgroup *, timeperiod *, timeperiod *, command *, command *);
extern json_object *json_status_host(unsigned, host *, hoststatus *);
extern void json_status_host_details(json_object *, unsigned, host *, 
		hoststatus *);

extern json_object *json_status_servicecount(unsigned, host *, int, host *, 
		int, host *, hostgroup *, servicegroup *, int, int, contact *, int, 
		time_t, time_t, char *, char *, char *, contactgroup *, timeperiod *,
		timeperiod *, command *, command *);
extern json_object *json_status_servicelist(unsigned, int, int, int, host *, 
		int, host *, int, host *, hostgroup *, servicegroup *, int, int, 
		contact *, int, time_t, time_t, char *, char *, char *, contactgroup *,
		timeperiod *, timeperiod *, command *, command *);
extern json_object *json_status_service(unsigned, service *, servicestatus *);
extern void json_status_service_details(json_object *, unsigned, service *,
		servicestatus *);

#if 0
extern void json_status_contactlist(unsigned, unsigned, unsigned, unsigned, 
		unsigned, contactgroup *);
extern void json_status_contactlist(unsigned, unsigned, unsigned, unsigned, 
		unsigned, contactgroup *);
extern void json_status_contact(unsigned, unsigned, contact *);
extern void json_status_contact_details(unsigned, unsigned, contact *);
#endif

extern json_object *json_status_commentcount(unsigned, int, time_t, time_t,
		unsigned, unsigned, unsigned, unsigned, char *, char *);
extern json_object *json_status_commentlist(unsigned, int, int, int, int, 
		time_t, time_t, unsigned, unsigned, unsigned, unsigned, char *, char *);
extern json_object *json_status_comment(unsigned, nagios_comment *);
extern void json_status_comment_details(json_object *, unsigned,
		nagios_comment *);

extern json_object *json_status_downtimecount(unsigned, int, time_t, time_t, 
		unsigned, unsigned, unsigned, int, unsigned, char *, char *);
extern json_object *json_status_downtimelist(unsigned, int, int, int, int, 
		time_t, time_t, unsigned, unsigned, unsigned, int, unsigned, char *,
		char *);
extern json_object *json_status_downtime(unsigned, scheduled_downtime *);
extern void json_status_downtime_details(json_object *, unsigned, 
		scheduled_downtime *);

extern json_object *json_status_program(unsigned);

extern json_object *json_status_performance(void);

#endif
