import { View, Property, ViewBase, EventData, Color, ObservableArray } from '@nativescript/core';

/**
 * Font style enumeration
 */
export enum CalendarFontStyle {
	/**
	 * Regular font style
	 */
	Normal = 'Normal',
	/**
	 * Bold font style
	 */
	Bold = 'Bold',
	/**
	 * Italic font style
	 */
	Italic = 'Italic',
	/**
	 * Combine Bold and Italic styles
	 */
	BoldItalic = 'BoldItalic'
}

/**
 * Defines the possible values for the {@link viewMode} property
 * for the relevant {@link RadCalendar} instance.
 */
export enum CalendarViewMode {
	/**
	 * {@link RadCalendar} will display a single week.
	 */
	Week = 'Week',

	/**
	 * RadCalendar will display one month.
	 */
	Month = 'Month',

	/**
	 * RadCalendar will display a list of month names.
	 */
	MonthNames = 'MonthNames',

	/**
	 * RadCalendar will display a whole year.
	 */
	Year = 'Year',

	/**
	 * RadCalendar will display a timeline for a single day.
	 */
	Day = 'Day'
}

/**
 * Lists the possible selection shapes for the selected state of the day cells.
 */
export enum CalendarSelectionShape {
	/**
	 * Activates the round selection shape. In this mode, a circle is drawn
	 * as a decoration when a cell is selected.
	 */
	Round = 'Round',

	/**
	 * Activates the square selection shape. In this mode, a square is drawn
	 * as a decoration when a cell is selected.
	 */
	Square = 'Square',

	/**
	 * Activates the default selection shape. In the default case the background
	 * of the selected cell is changed.
	 */
	None = 'None'
}

/**
 * Defines the possible values for the {@link selectionMode} property
 * for the relevant {@link RadCalendar} instance.
 */
export enum CalendarSelectionMode {
	/**
	 * When {@link RadCalendar} is in None selection mode,
	 * no date can be selected.
	 */
	None = 'None',

	/**
	 * When {@link RadCalendar} is in Single selection mode,
	 * only one date can be selected at a time.
	 */
	Single = 'Single',

	/**
	 * When {@link RadCalendar} is in Multiple selection mode,
	 * the selected dates can be more than one at the same time.
	 */
	Multiple = 'Multiple',

	/**
	 * When {@link RadCalendar} is in Range selection mode,
	 * the selected dates can be more than one as long as they form a range of consecutive dates.
	 */
	Range = 'Range'
}

/**
 * Defines the possible values for the {@link transitionMode} property
 * for the relevant {@link RadCalendar} instance.
 */
export enum CalendarTransitionMode {
	/**
	 * Transitions with gestures are disabled and no animation is applied when transitioning programmatically.
	 * Available in iOS and Android.
	 */
	None = 'None',

	/**
	 * Slide animation is applied when transitioning between views in {@link RadCalendar}.
	 * Available in iOS and Android.
	 */
	Slide = 'Slide',

	/**
	 * Stack animation is applied when transitioning between views in {@link RadCalendar}.
	 * Available in iOS and Android.
	 */
	Stack = 'Stack',

	/**
	 * Flip animation is applied when transitioning between views in {@link RadCalendar}.
	 * Available only in iOS.
	 */
	Flip = 'Flip',

	/**
	 * Fold animation is applied when transitioning between views in {@link RadCalendar}.
	 * Available only in iOS.
	 */
	Fold = 'Fold',

	/**
	 * Float animation is applied when transitioning between views in {@link RadCalendar}.
	 * Available only in iOS.
	 */
	Float = 'Float',

	/**
	 * Rotate animation is applied when transitioning between views in {@link RadCalendar}.
	 * Available only in iOS.
	 */
	Rotate = 'Rotate',

	/**
	 * Allows non inertial scrolling between views in {@link RadCalendar}.
	 * Available only in Android.
	 */
	Plain = 'Plain',

	/**
	 * Allows inertial scrolling between views in {@link RadCalendar}.
	 * Available only in Android.
	 */
	Free = 'Free',

	/**
	 * Applies intertidal slide animation when transitioning between views in {@link RadCalendar}.
	 * Available only in Android.
	 */
	Combo = 'Combo',

	/**
	 * Views overlap when transitioning in {@link RadCalendar}.
	 * Available only in Android.
	 */
	Overlap = 'Overlap'
}

/**
 * Defines the possible view modes for day events view which appears when
 * day cell is tapped in month view mode.
 */
export enum CalendarEventsViewMode {
	/**
	 * Do not show day events list when a day cell is tapped.
	 * This is the default value.
	 */
	None = 'None',

	/**
	 * Show day events list in an inline view.
	 */
	Inline = 'Inline',

	/**
	 * Show day events in a popover view.
	 * In iOS this is available only for iPad user interface idiom.
	 */
	Popover = 'Popover'
}

/**
 * Defines the alignment options for cells in Calendar component.
 */
export enum CalendarCellAlignment {
	/**
     The cell content is aligned to left.
     */
	Left = 'Left',
	/**
     The cell content is aligned to right.
     */
	Right = 'Right',
	/**
     The cell content is aligned to top.
     */
	Top = 'Top',
	/**
     The cell content is aligned to bottom.
     */
	Bottom = 'Bottom',
	/**
     The cell content is aligned horizontally.
     */
	HorizontalCenter = 'HorizontalCenter',
	/**
     The cell content is aligned vertically.
     */
	VerticalCenter = 'VerticalCenter',
	/**
     The cell content is center aligned both horizontally and vertically.
     */
	Center = 'Center'
}

/**
 * Instance of this class is exposed by the {@link selectedDateRange} property
 * of {@link RadCalendar}.
 */
export class DateRange {
	/**
	 * Creates a new DateRange.
	 */
	constructor();

	/**
	 * Creates a DateRange between the specified startDate and endDate.
	 */
	constructor(startDate: Date, endDate: Date);

	/***
	 * Indicates the first date of the range.
	 */
	startDate: Date;

	/**
	 * Indicates the last date of the range.
	 */
	endDate: Date;

	/**
	 * Normalizes the range if endDate is earlier than startDate.
	 */
	normalize(): void;
}

/**
 * Represents the event used by the {@link eventSource} property
 * of {@link RadCalendar}.
 */
export class CalendarEvent {
	/**
	 * Constructs an event with given parameters
	 */
	constructor(title: string, startDate: Date, endDate: Date, isAllDay?: boolean, eventColor?: Color);
	/**
	 * Indicates the title of the event.
	 */
	title: string;

	/**
	 * Indicates the start date of the event.
	 */
	startDate: Date;

	/**
	 * Indicates the end date of the event.
	 */
	endDate: Date;

	/**
	 * Indicates whether the event is an all day event.
	 */
	isAllDay: boolean;

	/**
	 * Indicates the color that will be used for representation of this event.
	 */
	eventColor: Color;
}

/**
 * Instances of this class are provided to the handlers of the {@link viewModeChangedEvent}.
 */
export class CalendarViewModeChangedEventData implements EventData {
	/**
	 *Returns the name of the event that has been fired.
	 */
	eventName: string;

	/**
	 * The object that fires the event.
	 */
	object: any;

	/**
	 * The old value of the ViewMode property.
	 */
	oldValue: CalendarViewMode;

	/**
	 * The new value of the ViewMode property.
	 */
	newValue: CalendarViewMode;
}

/**
 * Instances of this class are provided to the handlers of the {@link cellTapEvent}.
 */
export class CalendarCellTapEventData implements EventData {
	/**
	 * Returns the name of the event that has been fired.
	 */
	eventName: string;

	/**
	 * The object that fires the event.
	 */
	object: any;

	/**
	 * The related native cell.
	 */
	cell: any;

	/**
	 * The related Date.
	 */
	date: Date;
}

/**
 * Instances of this class are provided to the handlers of the {@link dateSelectedEvent} and {@link dateDeselectedEvent}.
 */
export class CalendarSelectionEventData implements EventData {
	/**
	 *Returns the name of the event that has been fired.
	 */
	eventName: string;

	/**
	 * The object that fires the event.
	 */
	object: any;

	/**
	 * The relative Date.
	 */
	date: Date;
}

/**
 * Instances of this class are provided to the handlers of the {@link inlineEventSelectedEvent}.
 */
export class CalendarInlineEventSelectedData implements EventData {
	/**
	 * Returns the name of the event that has been fired.
	 */
	eventName: string;

	/**
	 * The object that fires the event.
	 */
	object: any;

	/**
	 * The data for inline event selected in calendar.
	 */
	eventData: CalendarEvent;
}

/**
 * Instances of this class are provided to the handlers of the {@link inlineEventSelectedEvent}.
 */
export class CalendarDayViewEventSelectedData implements EventData {
	/**
	 * Returns the name of the event that has been fired.
	 */
	eventName: string;

	/**
	 * The object that fires the event.
	 */
	object: any;

	/**
	 * The data for day view event selected in calendar.
	 */
	eventData: CalendarEvent;
}

/**
 * Instances of this class are provided to the handlers of the {@link navigatedToDateEvent} and {@link navigatingToDateStartedEvent}.
 */
export class CalendarNavigationEventData implements EventData {
	/**
	 *Returns the name of the event that has been fired.
	 */
	eventName: string;

	/**
	 * The object that fires the event.
	 */
	object: any;

	/**
	 * The relative Date.
	 */
	date: Date;
}

/**
 * Class that encapsulates all the styling options applicable for Month view.
 */
export class CalendarMonthViewStyle extends ViewBase {
	/**
	 * Identifies the {@link selectionShape} dependency property.
	 */
	static selectionShapeProperty: Property<CalendarMonthViewStyle, CalendarSelectionShape>;

	/**
	 * Gets or sets a value from the {@link SelectionShape} enumeration defining the
	 * decoration drawn on the selected cell.
	 */
	selectionShape: CalendarSelectionShape;

	/**
	 * Identifies the {@link selectionShapeSize} dependency property.
	 */
	static selectionShapeSizeProperty: Property<CalendarMonthViewStyle, number>;

	/**
	 * Defines the size of the chosen selection shape. The size determines the radius of
	 * the selection circle in case the shape is selected to be round or the side of the square in case the seleciton
	 * is selected to be square.
	 */
	selectionShapeSize: number;

	/**
	 * Identifies the {@link selectionShapeColor} dependency property.
	 */
	static selectionShapeColorProperty: Property<CalendarMonthViewStyle, Color>;

	/**
	 * Defines the color of the selection shape.
	 */
	selectionShapeColor: Color;

	/**
	 * Identifies the {@link showWeekNumbers} dependency property.
	 */
	static showWeekNumbersProperty: Property<CalendarMonthViewStyle, boolean>;
	/**
	 * Gets or sets if weekend numbers should be shown in month view of calendar.
	 */
	showWeekNumbers: boolean;

	/**
	 * Identifies the {@link showTitle} dependency property.
	 */
	static showTitleProperty: Property<CalendarMonthViewStyle, boolean>;
	/**
	 * Gets or sets if title of calendar should be shown in month view.
	 */
	showTitle: boolean;

	/**
	 * Identifies the {@link showDayNames} dependency property.
	 */
	static showDayNamesProperty: Property<CalendarMonthViewStyle, boolean>;
	/**
	 * Gets or sets if day names should be shown in month view.
	 */
	showDayNames: boolean;

	/**
	 * Identifies the {@link backgroundColor} dependency property.
	 */
	static backgroundColorProperty: Property<CalendarMonthViewStyle, Color>;
	/**
	 * Gets or sets the background color of calendar in month view.
	 */
	backgroundColor: Color;

	/**
	 * Identifies the {@link dayCellStyle} dependency property.
	 */
	static dayCellStyleProperty: Property<CalendarMonthViewStyle, DayCellStyle>;
	/**
	 * Gets or sets the instance of {@link DayCellStyle} class with properties used for styling of day cells.
	 */
	dayCellStyle: DayCellStyle;

	/**
	 * Identifies the {@link selectedDayCellStyle} dependency property.
	 */
	static selectedDayCellStyleProperty: Property<CalendarMonthViewStyle, DayCellStyle>;
	/**
	 * Gets or sets the instance of {@link DayCellStyle} with properties used for styling of selected day cells.
	 */
	selectedDayCellStyle: DayCellStyle;

	/**
	 * Identifies the {@link todayCellStyle} dependency property.
	 */
	static todayCellStyleProperty: Property<CalendarMonthViewStyle, DayCellStyle>;
	/**
	 * Gets or sets the instance of {@link DayCellStyle} with properties used for styling of the cell for today date.
	 */
	todayCellStyle: DayCellStyle;

	/**
	 * Identifies the {@link disabledCellStyle} dependency property.
	 */
	static disabledCellStyleProperty: Property<CalendarMonthViewStyle, DayCellStyle>;
	/**
	 * Gets or sets the instance of {@link DayCellStyle} with properties used for styling of disabled day cells.
	 * Available only in iOS.
	 */
	disabledCellStyle: DayCellStyle;

	/**
	 * Identifies the {@link anotherMonthCellStyle} dependency property.
	 */
	static anotherMonthCellStyleProperty: Property<CalendarMonthViewStyle, DayCellStyle>;
	/**
	 * Gets or sets the instance of {@link DayCellStyle} with properties used for styling of cells which are in the previous or next month.
	 * Available only in iOS.
	 */
	anotherMonthCellStyle: DayCellStyle;

	/**
	 * Identifies the {@link dayNameCellStyle} dependency property.
	 */
	static dayNameCellStyleProperty: Property<CalendarMonthViewStyle, CellStyle>;
	/**
	 * Gets or sets the instance of {@link CellStyle} with properties used for styling of the cells with day names.
	 */
	dayNameCellStyle: CellStyle;

	/**
	 * Identifies the {@link weekNumberCellStyle} dependency property.
	 */
	static weekNumberCellStyleProperty: Property<CalendarMonthViewStyle, CellStyle>;
	/**
	 * Gets or sets the instance of {@link CellStyle} with properties used for styling of the cells with week numbers.
	 */
	weekNumberCellStyle: CellStyle;

	/**
	 * Identifies the {@link weekendCellStyle} dependency property.
	 */
	static weekendCellStyleProperty: Property<CalendarMonthViewStyle, CellStyle>;
	/**
	 * Gets or sets the instance of {@link CellStyle} with properties used for styling of the cells for weekend days.
	 */
	weekendCellStyle: CellStyle;

	/**
	 * Identifies the {@link titleCellStyle} dependency property.
	 */
	static titleCellStyleProperty: Property<CalendarMonthViewStyle, CellStyle>;
	/**
	 * Gets or sets the instance of {@link DayCellStyle} with properties used for styling of the month title cell in month view.
	 */
	titleCellStyle: DayCellStyle;

	/**
	 * Identifies the {@link inlineEventCellStyle} dependency property.
	 */
	static inlineEventCellStyleProperty: Property<CalendarMonthViewStyle, InlineEventCellStyle>;

	/**
	 * Gets or sets the style properties for inline event cells in Month view mode.
	 * See {@link InlineEventCellStyle} for available styling properties.
	 */
	inlineEventCellStyle: InlineEventCellStyle;
}

/**
 * Style class for Week view mode. This class is for convenience and doesn't add any additional properties to its parent.
 */
export class CalendarWeekViewStyle extends CalendarMonthViewStyle {}

/**
 * Style class for Day view mode. This class is for convenience and doesn't add any additional properties to its parent.
 */
export class CalendarDayViewStyle extends CalendarWeekViewStyle {
	/**
	 * Identifies the {@link dayEventsViewStyle} dependency property.
	 */
	static dayEventsViewStyleProperty: Property<CalendarDayViewStyle, DayEventsViewStyle>;
	/**
	 * Gets or sets the instance of {@link DayCellStyle} with properties used for styling of the view with day events.
	 */
	dayEventsViewStyle: DayEventsViewStyle;

	/**
	 * Identifies the {@link allDayEventsViewStyle} dependency property.
	 */
	static allDayEventsViewStyleProperty: Property<CalendarDayViewStyle, DayEventsViewStyle>;
	/**
	 * Gets or sets the instance of {@link AllDayEventsViewStyle} with properties used for styling of the view with all day events.
	 */
	allDayEventsViewStyle: AllDayEventsViewStyle;

	/**
	 * Identifies the {@link showWeek} dependency property.
	 */
	static showWeekProperty: Property<CalendarDayViewStyle, boolean>;
	/**
	 * Gets or sets a value indicating whether all days from the current week will be visible at the top.
	 */
	showWeek: boolean;
}

/**
 * Style class for Year view mode
 */
export class CalendarYearViewStyle extends ViewBase {
	/**
	 * Identifies the {@link titleCellStyle} dependency property.
	 */
	static titleCellStyleProperty: Property<CalendarMonthViewStyle, CellStyle>;

	/**
	 * Gets or sets the style properties for title cell in year view mode. See {@link CellStyle} properties.
	 */
	titleCellStyle: CellStyle;

	/**
	 * Identifies the {@link monthCellStyle} dependency property.
	 */
	static monthCellStyleProperty: Property<CalendarYearViewStyle, MonthCellStyle>;
	/**
	 * Gets or sets the style properties for month cell in year view mode. See {@link MonthCellStyle} properties.
	 */
	monthCellStyle: MonthCellStyle;
}

/**
 * Style class for Month names view mode.
 */
export class CalendarMonthNamesViewStyle extends ViewBase {
	/**
	 * Identifies the {@link titleCellStyle} dependency property.
	 */
	static titleCellStyleProperty: Property<CalendarYearViewStyle, CellStyle>;

	/**
	 * Gets or sets the style properties for title cell in month names view mode. See {@link CellStyle} properties.
	 */
	titleCellStyle: CellStyle;

	/**
	 * Identifies the {@link monthNameCellStyle} dependency property.
	 */
	static monthNameCellStyleProperty: Property<CalendarMonthNamesViewStyle, CellStyle>;
	/**
	 * Gets or sets the style properties for month cell in month names view mode. See {@link CalendarMonthNamesViewStyle} properties.
	 */
	monthNameCellStyle: CellStyle;
}

/**
 * The class with base properties for regular date cells in calendar view.
 */
export class CellStyle extends ViewBase {
	/**
	 * Identifies the {@link cellBorderWidth} dependency property.
	 */
	static cellBorderWidthProperty: Property<CellStyle, number>;
	/**
	 * Gets or sets the width of cell border
	 */
	cellBorderWidth: number;

	/**
	 * Identifies the {@link cellBorderColor} dependency property.
	 */
	static cellBorderColorProperty: Property<CellStyle, Color>;
	/**
	 * Gets or sets the color of cell border
	 */
	cellBorderColor: Color;

	/**
	 * Identifies the {@link cellBackgroundColor} dependency property.
	 */
	static cellBackgroundColorProperty: Property<CellStyle, Color>;
	/**
	 * Gets or sets the background of cell
	 */
	cellBackgroundColor: Color;

	/**
	 * Identifies the {@link cellAlignment} dependency property.
	 */
	static cellAlignmentProperty: Property<CellStyle, CalendarCellAlignment>;
	/**
	 * Gets or sets the content alignment of cell.
	 */
	cellAlignment: CalendarCellAlignment;

	/**
	 * Identifies the {@link cellTextColor} dependency property.
	 */
	static cellTextColorProperty: Property<CellStyle, Color>;
	/**
	 * Gets or sets the text color of the cell. Use predefined colors from Color module or hex value in format "#RGBA"
	 */
	cellTextColor: Color;

	/**
	 * Identifies the {@link cellTextFontName} dependency property.
	 */
	static cellTextFontNameProperty: Property<CellStyle, string>;
	/**
	 * Gets or sets the name of the font used for text.
	 * If font with this name is not available the standard font is used instead.
	 * You can specify different font names for ios and android using attribute specifiers.
	 */
	cellTextFontName: string;

	/**
	 * Identifies the {@link cellTextFontStyle} dependency property.
	 */
	static cellTextFontStyleProperty: Property<CellStyle, CalendarFontStyle>;
	/**
	 * Gets or sets the style of the font used for text in cell.
	 */
	cellTextFontStyle: CalendarFontStyle;

	/**
	 * Identifies the {@link cellTextSize} dependency property.
	 */
	static cellTextSizeProperty: Property<CellStyle, number>;
	/**
	 * Gets or sets the size of text in cell.
	 */
	cellTextSize: number;

	/**
	 * Identifies the {@link cellPaddingHorizontal} dependency property.
	 */
	static cellPaddingHorizontalProperty: Property<CellStyle, number>;
	/**
	 * Gets or sets the horizontal padding amount.
	 */
	cellPaddingHorizontal: number;

	/**
	 * Identifies the {@link cellPaddingVertical} dependency property.
	 */
	static cellPaddingVerticalProperty: Property<CellStyle, number>;
	/**
	 * Gets or sets the vertical padding amount.
	 */
	cellPaddingVertical: number;
}

export class DayEventsViewStyle extends ViewBase {
	/**
	 * Identifies the {@link backgroundColor} dependency property.
	 */
	static backgroundColorProperty: Property<DayEventsViewStyle, Color>;
	/**
	 * Gets or sets the background color.
	 */
	public backgroundColor: Color;

	/**
	 * Identifies the {@link timeLabelFormat} dependency property.
	 */
	static timeLabelFormatProperty: Property<DayEventsViewStyle, string>;
	/**
	 * Gets or sets the format of the time labels.
	 */
	public timeLabelFormat: string;

	/**
	 * Identifies the {@link timeLabelTextColor} dependency property.
	 */
	static timeLabelTextColorProperty: Property<DayEventsViewStyle, Color>;
	/**
	 * Gets or sets the text color for the time labels.
	 */
	public timeLabelTextColor: Color;

	/**
	 * Identifies the {@link timeLabelTextSize} dependency property.
	 */
	static timeLabelTextSizeProperty: Property<DayEventsViewStyle, number>;
	/**
	 * Gets or sets the text size for the time labels.
	 */
	public timeLabelTextSize: number;
}

export class AllDayEventsViewStyle extends ViewBase {
	/**
	 * Identifies the {@link backgroundColor} dependency property.
	 */
	static backgroundColorProperty: Property<AllDayEventsViewStyle, Color>;
	/**
	 * Gets or sets the background color.
	 */
	public backgroundColor: Color;

	/**
	 * Identifies the {@link allDayText} dependency property.
	 */
	static allDayTextProperty: Property<AllDayEventsViewStyle, string>;
	/**
	 * Gets or sets the text for the all day text.
	 */
	public allDayText: string;

	/**
	 * Identifies the {@link allDayTextIsVisible} dependency property.
	 */
	static allDayTextIsVisibleProperty: Property<AllDayEventsViewStyle, boolean>;
	/**
	 * Gets or sets a value indicating whether the all day text should be visible.
	 */
	public allDayTextIsVisible: boolean;
}

/**
 * Inherited from {@link CellStyle}, this class provides some additional properties specific for days in calendar.
 */
export class DayCellStyle extends CellStyle {
	/**
	 * Identifies the {@link showEventsText} dependency property.
	 */
	static showEventsTextProperty: Property<DayCellStyle, boolean>;
	/**
	 * Gets or sets if events should be shown in cell with text alongside the shape or not.
	 */
	showEventsText: boolean;

	/**
	 * Identifies the {@link eventTextColor} dependency property.
	 */
	static eventTextColorProperty: Property<DayCellStyle, Color>;
	/**
	 * Gets or sets the color of the text for event in cell
	 */
	eventTextColor: Color;

	/**
	 * Identifies the {@link eventFontName} dependency property.
	 */
	static eventFontNameProperty: Property<DayCellStyle, string>;
	/**
	 * Gets or sets the name of the font used for event text in cell.
	 * If font with this name is not available the standard font is used instead.
	 * You can specify different font names for ios and android using attribute specifiers.
	 */
	eventFontName: string;

	/**
	 * Identifies the {@link eventFontStyle} dependency property.
	 */
	static eventFontStyleProperty: Property<DayCellStyle, CalendarFontStyle>;
	/**
	 * Gets or sets the style of the font used for event text in cell.
	 */
	eventFontStyle: CalendarFontStyle;

	/**
	 * Identifies the {@link eventTextSize} dependency property.
	 */
	static eventTextSizeProperty: Property<DayCellStyle, number>;
	/**
	 * Gets or sets the size of event text in cell.
	 */
	eventTextSize: number;
}
/**
 * The style class with customization properties for month sells in year view.
 * Note: this class is not inherited from CellStyle and doesn't include its properties.
 */
export class MonthCellStyle extends ViewBase {
	/**
	 * Identifies the {@link weekendTextColor} dependency property.
	 */
	static weekendTextColorProperty: Property<MonthCellStyle, Color>;

	/**
	 * Gets or sets the text color for weekend days.
	 */
	weekendTextColor: Color;

	/**
	 * Identifies the {@link todayTextColor} dependency property.
	 */
	static todayTextColorProperty: Property<MonthCellStyle, Color>;
	/**
	 * Gets or sets the text color for today date in month.
	 */
	todayTextColor: Color;

	/**
	 * Identifies the {@link dayTextColor} dependency property.
	 */
	static dayTextColorProperty: Property<MonthCellStyle, Color>;
	/**
	 * Gets or sets the text color for regular days in month.
	 */
	dayTextColor: Color;

	/**
	 * Identifies the {@link dayFontName} dependency property.
	 */
	static dayFontNameProperty: Property<MonthCellStyle, string>;
	/**
	 * Gets or sets the font name for days in month.
	 */
	dayFontName: string;

	/**
	 * Identifies the {@link dayFontStyle} dependency property.
	 */
	static dayFontStyleProperty: Property<MonthCellStyle, CalendarFontStyle>;
	/**
	 * Gets or sets the font style for days in month.
	 */
	dayFontStyle: CalendarFontStyle;

	/**
	 * Identifies the {@link dayTextSize} dependency property.
	 */
	static dayTextSizeProperty: Property<MonthCellStyle, number>;
	/**
	 * Gets or sets the size of text for days in month cell.
	 */
	dayTextSize: number;

	/**
	 * Identifies the {@link dayNameTextColor} dependency property.
	 */
	static dayNameTextColorProperty: Property<MonthCellStyle, Color>;
	/**
	 * Gets or sets the text color for day names in month cell.
	 */
	dayNameTextColor: Color;

	/**
	 * Identifies the {@link dayNameFontName} dependency property.
	 */
	static dayNameFontNameProperty: Property<MonthCellStyle, string>;
	/**
	 * Gets or sets the font for day names in month cell.
	 */
	dayNameFontName: string;

	/**
	 * Identifies the {@link dayNameFontStyle} dependency property.
	 */
	static dayNameFontStyleProperty: Property<MonthCellStyle, CalendarFontStyle>;
	/**
	 * Gets or sets the font style for day names in month cell.
	 */
	dayNameFontStyle: CalendarFontStyle;

	/**
	 * Identifies the {@link dayNameTextSize} dependency property.
	 */
	static dayNameTextSizeProperty: Property<MonthCellStyle, number>;
	/**
	 * Gets or sets the text size of day names in month cell.
	 */
	dayNameTextSize: number;

	/**
	 * Identifies the {@link monthNameTextColor} dependency property.
	 */
	static monthNameTextColorProperty: Property<MonthCellStyle, Color>;
	/**
	 * Gets or sets the text color for title of month in cell.
	 */
	monthNameTextColor: Color;

	/**
	 * Identifies the {@link monthNameFontName} dependency property.
	 */
	static monthNameFontNameProperty: Property<MonthCellStyle, string>;
	/**
	 * Gets or sets the font name for month title in cell.
	 */
	monthNameFontName: string;

	/**
	 * Identifies the {@link monthNameFontStyle} dependency property.
	 */
	static monthNameFontStyleProperty: Property<MonthCellStyle, CalendarFontStyle>;
	/**
	 * Gets or sets the font style for month title in cell.
	 */
	monthNameFontStyle: CalendarFontStyle;

	/**
	 * Identifies the {@link monthNameTextSize} dependency property.
	 */
	static monthNameTextSizeProperty: Property<MonthCellStyle, number>;
	/**
	 * Gets or sets the text size for month title in cell.
	 */
	monthNameTextSize: number;
}

/**
 * Cell style class for inline events cells in month view mode.
 */
export class InlineEventCellStyle extends ViewBase {
	/**
	 * Identifies the {@link cellBackgroundColor} dependency property.
	 */
	static cellBackgroundColorProperty: Property<InlineEventCellStyle, Color>;

	/**
	 * Gets or sets the background color of inline events cell.
	 */
	cellBackgroundColor: Color;

	/**
	 * Identifies the {@link eventTextColor} dependency property.
	 */
	static eventTextColorProperty: Property<InlineEventCellStyle, Color>;

	/**
	 * Gets or sets the color for inline event text.
	 */
	eventTextColor: Color;

	/**
	 * Identifies the {@link eventFontName} dependency property.
	 */
	static eventFontNameProperty: Property<InlineEventCellStyle, string>;

	/**
	 * Gets or sets the font name for inline event text.
	 */
	eventFontName: string;

	/**
	 * Identifies the {@link eventFontStyle} dependency property. Use values from {@link FontStyles} module.
	 */
	static eventFontStyleProperty: Property<InlineEventCellStyle, CalendarFontStyle>;

	/**
	 * Gets or sets the font style for inline event text.
	 */
	eventFontStyle: CalendarFontStyle;

	/**
	 * Identifies the {@link eventTextSize} dependency property.
	 */
	static eventTextSizeProperty: Property<InlineEventCellStyle, number>;

	/**
	 * Gets or sets the text size for inline event text.
	 */
	eventTextSize: number;

	/**
	 * Identifies the {@link timeTextColor} dependency property.
	 */
	static timeTextColorProperty: Property<InlineEventCellStyle, Color>;

	/**
	 * Gets or sets the color for time shown for inline event.
	 */
	timeTextColor: Color;

	/**
	 * Identifies the {@link timeFontName} dependency property.
	 */
	static timeFontNameProperty: Property<InlineEventCellStyle, string>;

	/**
	 * Gets or sets the font name for time shown for inline event.
	 */
	timeFontName: string;

	/**
	 * Identifies the {@link timeFontStyle} dependency property.
	 */
	static timeFontStyleProperty: Property<InlineEventCellStyle, CalendarFontStyle>;

	/**
	 * Gets or sets the font style for time shown for inline event.
	 */
	timeFontStyle: CalendarFontStyle;

	/**
	 * Identifies the {@link timeTextSize} dependency property.
	 */
	static timeTextSizeProperty: Property<InlineEventCellStyle, number>;
	/**
	 * Gets or sets the text size for time shown for inline event.
	 */
	timeTextSize: number;
}

/**
 * This class represents the RadCalendar component.
 * The component exposes all major features supported
 * by the native controls through a unified API suitable for NativeScript developers.
 */
export class RadCalendar extends View {
	/**
	 * This event is fired when a date is selected.
	 * The event exposes an instance of the {@link CalendarSelectionEventData} class.
	 */
	public static dateSelectedEvent: string;

	/**
	 * This event is fired when a date is deselected.
	 * The event exposes an instance of the {@link CalendarSelectionEventData} class.
	 */
	public static dateDeselectedEvent: string;

	/**
	 * This event is fired when a cell is tapped.
	 * The event exposes an instance of the {@link CalendarCellTapEventData} class.
	 */
	public static cellTapEvent: string;

	/**
	 * This event is fired when {@link RadCalendar} an inline event has been tapped.
	 * The event exposes an instance of the {@link CalendarInlineEventSelectedData} class.
	 */
	public static inlineEventSelectedEvent: string;

	/**
	 * This event is fired when {@link RadCalendar} an event from the day view has been tapped.
	 * The event exposes an instance of the {@link CalendarDayViewEventSelectedData} class.
	 */
	public static dayViewEventSelectedEvent: string;

	/**
	 * This event is fired when {@link RadCalendar} has navigated to a certain date.
	 * The event exposes an instance of the {@link CalendarNavigationEventData} class.
	 */
	public static navigatedToDateEvent: string;

	/**
	 * This event is fired when {@link RadCalendar} is about to navigate to a certain date.
	 * The event exposes an instance of the {@link CalendarNavigationEventData} class.
	 */
	public static navigatingToDateStartedEvent: string;

	/**
	 * This event is fired when {@link RadCalendar}'s {@link viewMode} has been changed.
	 * The event exposes an instance of the {@link CalendarViewModeChangedEventData} class.
	 */
	public static viewModeChangedEvent: string;

	/**
	 * Identifies the {@link locale} dependency property.
	 */
	static localeProperty: Property<RadCalendar, string>;

	/**
	 * Gets or sets the locale used throughout {@link RadCalendar}. Valid locale values
	 * are standard BCP-47 language tags like: us-US, ru-RU, bg-BG, etc.
	 */
	locale: string;

	/**
	 * Identifies the {@link minDate} dependency property.
	 */
	static minDateProperty: Property<RadCalendar, Date>;

	/**
	 * Gets or sets the min date accessible by the (@link RadCalendar) instance.
	 */
	minDate: Date;

	/**
	 * Identifies the {@link maxDate} dependency property.
	 */
	static maxDateProperty: Property<RadCalendar, Date>;

	/**
	 * Gets or sets the max date accessible by the (@link RadCalendar) instance.
	 */
	maxDate: Date;

	/**
	 * Identifies the {@link selectedDate} dependency property.
	 */
	static selectedDateProperty: Property<RadCalendar, Date>;

	/**
	 * Gets or sets the current selected date in the {@link RadCalendar} instance.
	 */
	selectedDate: Date;

	/**
	 * Identifies the {@link selectedDates} dependency property.
	 */
	static selectedDatesProperty: Property<RadCalendar, any>;

	/**
	 * Gets or sets the current selected dates in the {@link RadCalendar} instance.
	 */
	selectedDates: any;

	/**
	 * Identifies the {@link selectedDateRange} dependency property.
	 */
	static selectedDateRangeProperty: Property<RadCalendar, DateRange>;

	/**
	 * Gets or sets the current selected date range in the {@link RadCalendar} instance.
	 */
	selectedDateRange: DateRange;

	/**
	 * Identifies the {@link viewMode} dependency property.
	 */
	static viewModeProperty: Property<RadCalendar, CalendarViewMode>;

	/**
	 * Gets or sets the current view mode in the {@link RadCalendar} instance.
	 */
	viewMode: CalendarViewMode;

	/**
	 * Identifies the {@link eventsViewMode} dependency property.
	 */
	static eventsViewModeProperty: Property<RadCalendar, CalendarEventsViewMode>;

	/**
	 * Gets or sets the events view mode in {@link RadCalendar} instance.
	 */
	eventsViewMode: CalendarEventsViewMode;

	/**
	 * Identifies the {@link selectionMode} dependency property.
	 */
	static selectionModeProperty: Property<RadCalendar, CalendarSelectionMode>;

	/**
	 * Gets or sets the current selection mode in the {@link RadCalendar} instance.
	 */
	selectionMode: CalendarSelectionMode;

	/**
	 * Identifies the {@link transitionMode} dependency property.
	 */
	static transitionModeProperty: Property<RadCalendar, CalendarTransitionMode>;

	/**
	 * Gets or sets the current transition mode in the {@link RadCalendar} instance.
	 */
	transitionMode: CalendarTransitionMode;

	/**
	 * Gets the {@link displayedDate} dependency property.
	 */
	static displayedDateProperty: Property<RadCalendar, Date>;

	/**
	 * Gets or sets the current displayed date in the {@link RadCalendar} instance.
	 */
	displayedDate: Date;

	/**
	 * Identifies the {@link eventSource} dependency property.
	 */
	static eventSourceProperty: Property<RadCalendar, ObservableArray<CalendarEvent>>;

	/**
	 * Gets or sets the current event source in the {@link RadCalendar} instance.
	 */
	eventSource: ObservableArray<CalendarEvent>;

	/**
	 * Identifies the {@link horizontalTransition} dependency property.
	 */
	static horizontalTransitionProperty: Property<RadCalendar, boolean>;

	/**
	 * Gets or sets if the transition of the {@link RadCalendar} instance is horizontal.
	 */
	horizontalTransition: boolean;

	/**
	 * Identifies the {@link monthViewStyle} dependency property.
	 */
	static monthViewStyleProperty: Property<RadCalendar, CalendarMonthViewStyle>;

	/**
	 * Gets or sets the style properties for Month view mode.
	 * See {@link CalendarMonthViewStyle} for available styling properties.
	 */
	monthViewStyle: CalendarMonthViewStyle;

	/**
	 * Identifies the {@link monthViewStyle} dependency property.
	 */
	static weekViewStyleProperty: Property<RadCalendar, CalendarWeekViewStyle>;

	/**
	 * Gets or sets the style properties for Week view mode.
	 * See {@link CalendarWeekViewStyle} for available styling properties.
	 */
	weekViewStyle: CalendarWeekViewStyle;

	/**
	 * Identifies the {@link dayViewStyle} dependency property.
	 */
	static dayViewStyleProperty: Property<RadCalendar, CalendarDayViewStyle>;

	/**
	 * Gets or sets the style properties for Week view mode.
	 * See {@link CalendarDayViewStyle} for available styling properties.
	 */
	dayViewStyle: CalendarDayViewStyle;

	/**
	 * Identifies the {@link monthViewStyle} dependency property.
	 */
	static yearViewStyleProperty: Property<RadCalendar, CalendarYearViewStyle>;

	/**
	 * Gets or sets the style properties for Year view mode.
	 * See {@link CalendarYearViewStyle} for available styling properties.
	 */
	yearViewStyle: CalendarYearViewStyle;

	/**
	 * Identifies the {@link monthViewStyle} dependency property.
	 */
	static monthNamesViewStyleProperty: Property<RadCalendar, CalendarMonthNamesViewStyle>;

	/**
	 * Gets or sets the style properties for MonthNames view mode.
	 * See {@link CalendarMonthNamesViewStyle} for available styling properties.
	 */
	monthNamesViewStyle: CalendarMonthNamesViewStyle;

	/**
	 * Reloads all events in the {@link RadCalendar} instance and resets the selection.
	 */
	reload(): void;

	/**
	 * Navigates to the next screen in current view mode context.
	 */
	navigateForward(): void;

	/**
	 * Navigates to the previous screen in the current view mode context.
	 */
	navigateBack(): void;

	/**
	 * Navigates to the specified date.
	 */
	goToDate(date: Date): void;

	/**
	 * Gets an array with the events for a specific date.
	 */
	getEventsForDate(date: Date): Array<CalendarEvent>;

	/**
	 * Removes the selection, if any.
	 */
	clearSelection(): void;
}
