using System;
using System.Timers;

namespace TimedDoor
{
    // La classe TimerDoorWrapper contient en interne un timer pour la gestion d'une porte automatique
    // Elle permet de créer un timer customisé avec des infos supplémentaires et des fonctionnalités supplémentaires
    // infos supplémentaires: exemple public string TimerName { get; set; } permet de donner un nom au timer
    // Fonctionnalités supplémentaires:
    //      RegisterDoor: Une porte doit s'enregistrer auprès de TimerDoorWrapper. Le délégué HandlerDoorTimeOut est alors initialisé sur OnTimerOutEvent de la porte
    //      StartTimer: controle du démarrage du timer

    public class TimerDoorWrapper
    {
        private readonly Timer internalTimer;  //timer interne
        private IOnTimerOutEvent linkedDoor;   // référence vers la porte qui s'est enregistrée: POLYMORPHE la visibilité qui nous interesse est IOnTimerOutEvent
         XXXXXXXXXX       HandlerDoorTimeOut;  // délégué vers la méthode de callback de la porte qui gérera la fermeture automatique 

        public string TimerName { get; set; } // info supplémentaire: le timer à un nom

        public TimerDoorWrapper(int secondes,string name) // ctor
        {
            TimerName = name;
            double time = secondes*1000;
            // creation du timer interne NE PAS ACTIVER le timer
            XXXXX
             // initialise le call-back du timer vers OnTimedEvent
             XXXXXXXXXX   
        }

        public void StartTimer()
        {
            // valider le timer interne => au de xx secondes la callback du timer sera invoqué
            XXXXX

        }

        public void RegisterDoor(IOnTimerOutEvent door)
        {
            xxxx   // enregistre porte
            xxxx  // initialise délégué HandlerDoorTimeOut
        }


        private void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            internalTimer.Enabled = false; // on arrête le timer
            var timerDoorEventArg = xxxx // je cree un argument TimerDoorEventArg
            if (HandlerDoorTimeOut != null) 
                XXXXXX // on invoque le délégué HandlerDoorTimeOut
        }

        

    }
}