package impl;

import interfaces.AlgoDiffusion;
import interfaces.Capteur;
import interfaces.ObserverDeCapteurAsync;

import java.util.ArrayList;
import java.util.List;


public class CapteurImpl implements Capteur {
    private int value = 0;
    private AlgoDiffusion diffusion;
    protected List<ObserverDeCapteurAsync> observers=new ArrayList<ObserverDeCapteurAsync>();
    private boolean lock = false; //utilisé uniquement par les test !

    private long initialTime = System.currentTimeMillis(); // debug

    @Override
    public void attach(ObserverDeCapteurAsync o) {
        try {
            observers.add(o);
        }catch(Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void tick() {     
        if(!lock){   //utilisé uniqueemnt par les test pour bloquer la maj du capteur
            this.value++;
            System.out.println("tick(" + this.value+")\t\t" + (System.currentTimeMillis()-initialTime) + "ms");
        }
        diffusion.execute();
    }



    public void setAlgoDiffusion(AlgoDiffusion diffusion){
        this.diffusion = diffusion;
    }

    //AO2 - Concrete Servant
    @Override
    public int getValue() {
        return this.value;
    }

    @Override
    public int getValueDiffusion(){
        return this.diffusion.getValue();
    }


    public void stop(){
        this.lock = true;
    }

    public boolean isStop(){
        return this.lock;
    }

}
