#ifndef EXT_DATE_COMMON_H
#define EXT_DATE_COMMON_H

#include "sieve-common.h"

#include <time.h>

/*
 * Extension
 */

extern const struct sieve_extension_def date_extension;

bool ext_date_interpreter_load(const struct sieve_extension *ext,
			       const struct sieve_runtime_env *renv,
			       sieve_size_t *address ATTR_UNUSED);

/*
 * Tests
 */

extern const struct sieve_command_def date_test;
extern const struct sieve_command_def currentdate_test;

/*
 * Operations
 */

enum ext_date_opcode {
	EXT_DATE_OPERATION_DATE,
	EXT_DATE_OPERATION_CURRENTDATE,
};

extern const struct sieve_operation_def date_operation;
extern const struct sieve_operation_def currentdate_operation;

/*
 * Zone string
 */

bool ext_date_parse_timezone(const char *zone, int *zone_offset_r);

/*
 * Current date
 */

time_t ext_date_get_current_date(const struct sieve_runtime_env *renv,
				 int *zone_offset_r);

/*
 * Date part
 */

struct ext_date_part {
	const char *identifier;

	const char *(*get_string)(struct tm *tm, int zone_offset);
};

const struct ext_date_part *ext_date_part_find(const char *part);

const char *ext_date_part_extract(const struct ext_date_part *dpart,
				  struct tm *tm, int zone_offset);

/*
 * Date stringlist
 */

enum ext_date_timezone_special {
	EXT_DATE_TIMEZONE_LOCAL    = 100,
	EXT_DATE_TIMEZONE_ORIGINAL = 101
};

struct sieve_stringlist *
ext_date_stringlist_create(const struct sieve_runtime_env *renv,
			   struct sieve_stringlist *field_values,
			   int time_zone, const struct ext_date_part *dpart);

#endif
