class CameraEditor {
    constructor(canvas) {
        this.canvas = canvas;
        this.ctx = canvas.getContext("2d");
        this.video = document.createElement("video");
        this.width;
        this.height; //calculé automatiquement en fonction de la largeur du flux vidéo
        this.videoWidth;
        this.videoHeight;
        this.streaming = false;
        this.activeEffects = [];
        this.images = {};
        this._startup();
        this._loadImages();
    }

    _startup() {
        navigator.mediaDevices
            .getUserMedia({ video: true, audio: false })
            .then((stream) => {
                this.video.srcObject = stream;
                this.video.play();
            })
            .catch((err) => {
                console.error(`Erreur pendant la lecture de la camera: ${err}`);
            });

        this.video.addEventListener(
            "canplay",
            (ev) => {
                if (!this.streaming) {
                    //calcul de la taille de la vidéo en fonction de la taille de la fenêtre pour qu'elle soit toujours visible
                    let aspectRatio = this.video.videoWidth / this.video.videoHeight;
                    if(window.innerHeight * aspectRatio > window.innerWidth){
                        this.width = window.innerWidth;
                        this.height = window.innerWidth / aspectRatio;
                    }else{
                        this.width = window.innerHeight * aspectRatio;
                        this.height = window.innerHeight;
                    }

                    this.videoHeight = this.video.videoHeight;
                    this.videoWidth = this.video.videoWidth;

                    this.video.setAttribute("width", this.width);
                    this.video.setAttribute("height", this.height);
                    this.canvas.setAttribute("width", this.width);
                    this.canvas.setAttribute("height", this.height);
                    this.streaming = true;
                }
            },
            false
        );
    }

    _loadImages() {
        this.images.thumbsUp = new Image();
        this.images.thumbsUp.src = "assets/img/thumbs_up.png";
    }

    _frame() {
        const context = canvas.getContext("2d");
        if(this.streaming) {
            if (this.width && this.height) {
                canvas.width = this.width;
                canvas.height = this.height;
                context.drawImage(this.video, 0, 0, this.width, this.height);
                this._drawEffects();
            }
        }
        requestAnimationFrame(() => this._frame());
    }

    _scaleEffect(x,y,width,height){
        let xScale = this.width / this.videoWidth;
        let yScale = this.height / this.videoHeight;
        return {
            x: x * xScale,
            y: y * yScale,
            width: width * xScale,
            height: height * yScale
        }
    }

    _drawEffects() {
        for (let effect of this.activeEffects) {
            let {x,y,width,height} = this._scaleEffect(effect.x,effect.y,effect.width,effect.height);
            if(effect.type == "thumbs_up"){
                this._drawThumbsUp(x,y,width,height);
            }
        }
    }

    _drawThumbsUp(x,y,width,height){
        this.ctx.beginPath();
        this.ctx.drawImage(this.images.thumbsUp,x,y,width,height);
        this.ctx.stroke();
    }

    setEffects(effects) {
        this.activeEffects = effects;
    }
}