const moment = require('moment');
const io = require('./socketio')

let timerInterval;
let duration = moment.duration(7, 'minutes');        // Initial duration
let durationLeft = moment.duration(7, 'minutes');    // durationLeft after the timer has been started

let isPaused = true;                                    // Status of the timer

// Function prototypes
function start() {};
function pause() {};
function reset() {};
function end() {};
function print() {};
function incDec() {};
function getValues() {};

// Start timer not paused and not already finished
function start() {
    if(isPaused == true && durationLeft.asSeconds() != 0) {     // Only allow start if timer ist currently paused and durationLeft is not 0 seconds
        console.log("Timer gestartet")
        isPaused = false                                        // Set status of the timer
    
        timerInterval = setInterval(() => {                     // Create Intervalfunction every 1000ms
            durationLeft.subtract(1, 'second');                 // Subtract a second from from the timer
            console.log(print());                               // Print durationLeft
            io.sockets.emit('timerDurationLeft', print())       // Emit durationLeft to all connected sockets
            if(durationLeft.asSeconds() == 0)                   // End timer if durationLeft == 00:00
                end()
        }, 1000);
        return true
    } else
        return false
}

// If possible pause timer, if not return false
function pause() {
    if(!isPaused) {
        console.log("Timer pausiert");
        isPaused = true;                    // Set status of the timer
        clearInterval(timerInterval);       // End the execution
        return true
    } else
        return false
}

// Reset timer to passed value, and send durationLeft to all clients
function reset(newDuration) {
    console.log("Timer Zurückgesetzt");
    duration = moment.duration(newDuration, 'seconds').clone();     // Set initial duration to received duration in seconds
    durationLeft = duration.clone();                // Set durationLeft to the initial duration
    io.sockets.emit('timerDurationLeft', print())   // Emit durationLeft to all connected sockets
}

// Stop timer and emit timerEndet to all clients
function end() {
    isPaused = true                                 // Set status of the timer
    clearInterval(timerInterval);                   // End the execution
    io.sockets.emit('timerEnded', print())          // Emit end to all connected sockets
}

// Return formatted timestamp in the format of 00:00
function print() {
    var minutes = (durationLeft.minutes() < 10) ? "0" + durationLeft.minutes() : durationLeft.minutes();        // Create leading zeros for numbers <10
    var seconds = (durationLeft.seconds() < 10) ? "0" + durationLeft.seconds() : durationLeft.seconds();        // Create leading zeros for numbers <10
    return minutes + ":" + seconds
}

// Increase or decrease the timer depending on the passed value in seconds
function incDec(value) {
    if(Math.abs(value) >= durationLeft.asSeconds()) {       // If abs from passed value is greater than seconds left on timer, end timer
        end();
    } else {
        durationLeft.add(value, 'second');
        io.sockets.emit('timerDurationLeft', print())
    }
}

// Return all important timer values
function getValues() {
    return {
        isPaused: isPaused,
        duration: duration,
        durationLeft: durationLeft,
        print: print()
    };
}

module.exports = {
    duration, durationLeft, isPaused, start, pause, reset, end, print, incDec, getValues
}