using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VRH.Common;
namespace Vrh.iScheduler.Interfaces
{
    /// <summary>
    /// iScheduler beépülők számára készült interface.
    /// </summary>
    public interface ISchedulerPlugin
    {
        #region Properties

        /// <summary>
        /// A feladat végrehajtás (TimedTask) során keletkezett napló
        /// bejegyzések listája.
        /// </summary>
        List<string> LogEntries { get; }

        /// <summary>
        /// A beépülő neve. Kötelező.
        /// Ha üres, akkor a beépülő betöltésekor kivétel keletkezik.
        /// </summary>
        /// <remarks>
        /// Jelenleg egy típus van az 'iSchedulerReport', de nem fontos csak
        /// az ütemező számára egyedi legyen. De a lényeg, hogy az ütemező
        /// ez alapján tudja majd megtalálni több beépülő esetén, melyiket is kellene 
        /// használnia.
        /// </remarks>
        string Name { get; }

        #endregion Properties

        #region Methods

        /// <summary>
        /// Ütemezett (időzített) feladat végrehajtása.
        /// </summary>
        /// <param name="xml">Az ütemezett objektum típus XmlParser kapcsolati sztringje.</param>
        /// <param name="lcid">A környezetre érvényes nyelvi kód. Ha null, vagy üres, akkor az XML paraméterező fájlban beállított lesz az érvényes.</param>
        /// <param name="objectId">Az ütemezett objektum azonosítója.</param>
        /// <param name="operationId">Az ütemezett objektumon elvégzendő művelet azonosítója.</param>
        /// <param name="timeStamp">Az ütemezés ideje (OperationTime mező értéke) 'yyyyMMddHHmmss' sztring formátumban.</param>
        /// <param name="groupId">
        /// Az ütemezett objektum csoport azonosítója.
        /// Opcionális, ha üres vagy null, akkor az xml paraméterfájlban megadott lesz érvényes.
        /// </param>
        /// <returns>
        /// Egy <c>ReturnInfoJSON</c> objektum a message részében formázott html üzenettel.
        /// </returns>
        ReturnInfoJSON TimedTask(string xml, string lcid, string objectId, string operationId, string timeStamp, string groupId = null);

        /// <summary>
        /// Ütemezendő objektumok létezésének ellenőrzése.
        /// Az ütemező a <paramref name="objectList"/>-ben felsorolja, mely
        /// objektumokat ellenőrzi.
        /// </summary>
        /// <param name="xml">Az ütemezett objektum típus XmlParser kapcsolati sztringje.</param>
        /// <param name="objectList">Az ellenőrzendő objektumok listája, vesszővel elválasztva.</param>
        /// <param name="groupId">
        /// Az ütemezett objektum csoport azonosítója. 
        /// Opcionális, ha üres vagy null, akkor az xml paraméterfájlban megadott lesz érvényes.
        /// </param>
        /// <returns>
        /// Egy <c>CheckListJSON</c> elemekből álló lista.
        /// Ha nincs elem, akkor üres lista lesz az eredmény, nem null.
        /// </returns>
        List<CheckListJSON> CheckObjects(string xml, string objectList, string groupId = null);

        /// <summary>
        /// Az ütemezhető objektumok listája.
        /// </summary>
        /// <param name="xml">Az ütemezett objektum típus XmlParser kapcsolati sztringje.</param>
        /// <param name="isActiveOnly">
        /// Igaz, ha csak az aktív jelölésú ütemezhető objektumok kellenek.
        /// Alapértelmezett értéke: true.
        /// </param>
        /// <param name="groupId">
        /// Az ütemezett objektum csoport azonosítója. 
        /// Opcionális, ha üres vagy null, akkor az xml paraméterfájlban megadott lesz érvényes.
        /// </param>
        /// <returns>
        /// Egy <c>SelectListJSON</c> elemekből álló lista.
        /// Ha nincs elem, akkor üres lista lesz az eredmény, nem null.
        /// </returns>
        List<SelectListJSON> ListObjects(string xml, bool isActiveOnly = true, string groupId = null);


        /// <summary>
        /// Az ütemezésben kezdeményezhető műveletek listája.
        /// </summary>
        /// <returns>
        /// Egy <c>SelectListJSON</c> elemekből álló lista.
        /// Ha nincs elem, akkor üres lista lesz az eredmény, nem null.
        /// </returns>
        List<SelectListJSON> ListOperations();
        #endregion Methods
    }
}
