/**
 *                                                                            
 *  Copyright (c) 2011, 2018 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License 2.0        
 *  which accompanies this distribution, and is available at                  
 *  https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 *  SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 *
 */
grammar org.eclipse.osbp.xtext.signal.SignalDSL with org.eclipse.osbp.xtext.oxtype.OXtype

import "http://osbp.eclipse.org/xtext/signal/SignalDSL"
import "http://osbp.eclipse.org/xtext/datainterchange/DataDSL" as data
import "http://osbp.eclipse.org/dsl/common/types/v1" as types
import "http://www.eclipse.org/emf/2002/Ecore" as ecore

SignalModel:
	importSection=XImportSection?
	packages=SignalPackage;

SignalPackage:
	{SignalPackage} 'package' name=QualifiedName
	('{' 
		(signals+=SignalDefinition)* 
	'}')?
;

SignalDefinition:
	SignalWatcher | SignalScheduler
;

SignalWatcher:
	{SignalWatcher}
	'watcher' name=TRANSLATABLEID
	definition=WatcherDefinition
;

WatcherDefinition: 
	WatcherWithFileMask | WatcherWithFileName
;

WatcherWithFileMask: 
	{WatcherWithFileMask}
	'filemask' filemask=STRING
	executiontype=SignalExecutionTypeEnum
	'from' interchangegroup=[data::DataInterchangeGroup]
	'{'
		interchange=SignalDatainterchange
	'}'
;

WatcherWithFileName: 
	{WatcherWithFileName}
	'filename' filename=STRING
	executiontype=SignalExecutionTypeEnum
	'from' interchangegroup=[data::DataInterchangeGroup]
	'{'
		interchanges+=SignalDatainterchange*
	'}'
;

SignalScheduler:
	{SignalScheduler}
	'scheduler' name=TRANSLATABLEID
	schedulertype=SchedulerType
	(executiontype=SignalExecutionTypeEnum)?
	'from' interchangegroup=[data::DataInterchangeGroup]
	'{'
		interchanges+=SignalDatainterchange*
	'}'
;

SchedulerType: 
	CronScheduler | HourlyScheduler | DailyScheduler | WeeklyScheduler | MonthlyScheduler;

CronScheduler:
	'cron' expression=STRING;

HourlyScheduler:
	'hourlyat' minute=INT;

DailyScheduler:
	'dailyat' hour=INT ':' minute=INT; 
WeeklyScheduler:
	'weeklyon' dayofweek=DayOfWeekEnum 'at' hour=INT ':' minute=INT;

MonthlyScheduler:
	'monthlyon' dayofmonth=INT 'at' hour=INT ':' minute=INT;

SignalDatainterchange:
	dataAction=SignalActionEnum 
	dataRef=[data::DataInterchange] 
	(baseinterchange?='applyon')?
;

enum SignalActionEnum:
	DATAIMPORT='import' | 
	DATAEXPORT='export'
;

enum SignalExecutionTypeEnum:
	SEQ='sequential' | 
	NOSEQ='parallel'
;

enum DayOfWeekEnum:
	SUNDAY='sunday' |
	MONDAY='monday' |
	TUESDAY='tuesday' |
	WEDNESDAY='wednesday' |
	THURSDAY='thursday' |
	FRIDAY='friday' |
	SATURDAY='saturday'
;

TRANSLATABLEID:
	ID
;

TRANSLATABLESTRING:
	STRING
;