/* Sizes */
let checkBarWidth = 10;
let checkBarHeight = 140;

let digitBarWidth = 14;
let digitBarHeight = 100;

let textBarWidth = 56;
let textBarHeight = 20;

let textWidth = 14;
let textHeight = 20;

/* Offsets */
var startOffsetX = 17;
var startOffsetY = 30;

let startBarOffsetX = startOffsetX;
let startBarOffsetY = startOffsetY;

let upperTextBarLeftOffsetX = startBarOffsetX + checkBarWidth;
let upperTextBarLeftOffsetY = startOffsetY;

let midBarOffsetX = upperTextBarLeftOffsetX + textBarWidth;
let midBarOffsetY = startOffsetY;

let upperTextBarRightOffsetX = midBarOffsetX + checkBarWidth;
let upperTextBarRightOffsetY = startOffsetY;

let endBarOffsetX = upperTextBarRightOffsetX + textBarWidth;
let endBarOffsetY = startOffsetY;

let leftBarsStartX = startBarOffsetX + checkBarWidth;
let leftBarsStartY = upperTextBarLeftOffsetY + textBarHeight;

let rightBarsStartX = midBarOffsetX + checkBarWidth;
let rightBarsStartY = upperTextBarRightOffsetY + textBarHeight;

/* Utilities */
let stepCount = require("Storage").readJSON("stepCount",1);
if(stepCount === undefined) stepCount = 0;
let intCaster = num => Number(num);

var drawTimeout;

function renderWatch(l) {
    g.setFont("4x6",2);

    // work out how to display the current time

    var d = new Date();
    var h = d.getHours(), m = d.getMinutes();
    var time = h + ":" + ("0"+m).substr(-2);
    //var month = ("0" + (d.getMonth()+1)).slice(-2);
    var dayOfMonth = ('0' + d.getDate()).slice(-2);
    var dayOfWeek = d.getDay() || 7;
    var concatTime = ("0"+h).substr(-2) + ("0"+m).substr(-2) + dayOfMonth + dayOfWeek;

    const chars = String(concatTime).split("").map((concatTime) => {
        return Number(concatTime);
    });
    const checkSum = calculateChecksum(chars);
    concatTime += checkSum;

    drawCheckBar(startBarOffsetX, startBarOffsetY);

    drawLDigit(chars[0], 0, leftBarsStartY);
    drawLDigit(chars[1], 1, leftBarsStartY);
    drawLDigit(chars[2], 2, leftBarsStartY);
    drawLDigit(chars[3], 3, leftBarsStartY);

    g.drawString(getStepCount(), startOffsetX + checkBarWidth + 3, startOffsetY + 4);
    g.drawString(concatTime.substring(0,4), startOffsetX + checkBarWidth + 3, startOffsetY + textBarHeight + digitBarHeight + 6);

    drawCheckBar(midBarOffsetX, midBarOffsetY);

    drawRDigit(chars[4], 0, rightBarsStartY);
    drawRDigit(chars[5], 1, rightBarsStartY);
    drawRDigit(chars[6], 2, rightBarsStartY);
    drawRDigit(checkSum, 3, rightBarsStartY);

    g.drawString(Bangle.getStepCount(), midBarOffsetX + checkBarWidth + 3, startOffsetY + 4);
    g.drawString(concatTime.substring(4), midBarOffsetX + checkBarWidth + 3, startOffsetY + textBarHeight + digitBarHeight + 6);

    drawCheckBar(endBarOffsetX, endBarOffsetY);

    // schedule a draw for the next minute
    if (drawTimeout) {
        clearTimeout(drawTimeout);
    }
    drawTimeout = setTimeout(function() {
        drawTimeout = undefined;
        layout.render(layout.watch);
    }, (1000 * 60 * 5) - (Date.now() % (1000 * 60 * 5)));
}

function drawLDigit(digit, index, offsetY) {
    switch(digit) {
        case 0:
            drawLZeroWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 1:
            drawLOneWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 2:
            drawLTwoWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 3:
            drawLThreeWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 4:
            drawLFourWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 5:
            drawLFiveWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 6:
            drawLSixWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 7:
            drawLSevenWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 8:
            drawLEightWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 9:
            drawLNineWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY);
            break;
    }
}

function drawRDigit(digit, index, offsetY) {
    switch(digit) {
        case 0:
            drawRZeroWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 1:
            drawROneWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 2:
            drawRTwoWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 3:
            drawRThreeWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 4:
            drawRFourWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 5:
            drawRFiveWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 6:
            drawRSixWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 7:
            drawRSevenWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 8:
            drawREightWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY);
            break;
        case 9:
            drawRNineWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY);
            break;
    }
}

/*
LEAN

01234567890123
    xxxx    xx
    xx    xxxx
  xxxxxxxx  xx
  xx      xxxx
  xxxx      xx
  xx  xxxxxxxx
  xxxxxx  xxxx
  xxxx  xxxxxx
      xx  xxxx
      xxxx  xx
*/
function drawLOneWithOffset(offset, offsetY) {
    let barOneX = 4;
    let barTwoX = 12;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight);
    //g.drawString("1",offset+3,offsetY+digitHeight+5);
}

function drawLTwoWithOffset(offset, offsetY) {
    let barOneX = 4;
    let barTwoX = 10;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitBarHeight);
    //g.drawString("2",offset+3,offsetY+digitHeight+5);
}

function drawLThreeWithOffset(offset, offsetY) {
    let barOneX = 2;
    let barTwoX = 12;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+7+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight);
    //g.drawString("3",offset+3,offsetY+digitHeight+5);
}

function drawLFourWithOffset(offset, offsetY) {
    let barOneX = 2;
    let barTwoX = 10;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitBarHeight);
    //g.drawString("4",offset+3,offsetY+digitHeight+5);
}

function drawLFiveWithOffset(offset, offsetY) {
    let barOneX = 2;
    let barTwoX = 12;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight);
    //g.drawString("5",offset+3,offsetY+digitHeight+5);
}

function drawLSixWithOffset(offset, offsetY) {
    let barOneX = 2;
    let barTwoX = 6;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+7+offset,offsetY+digitBarHeight);
    //g.drawString("6",offset+3,offsetY+digitHeight+5);
}

function drawLSevenWithOffset(offset, offsetY) {
    let barOneX = 2;
    let barTwoX = 10;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+5+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitBarHeight);
    //g.drawString("7",offset+3,offsetY+digitHeight+5);
}

function drawLEightWithOffset(offset, offsetY) {
    let barOneX = 2;
    let barTwoX = 8;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+5+offset,offsetY+digitBarHeight);
    //g.drawString("8",offset+3,offsetY+digitHeight+5);
}

function drawLNineWithOffset(offset, offsetY) {
    let barOneX = 6;
    let barTwoX = 10;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitBarHeight);
    //g.drawString("9",offset+3,offsetY+digitHeight+5);
}

function drawLZeroWithOffset(offset, offsetY) {
    let barOneX = 6;
    let barTwoX = 12;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight);
    //g.drawString("0",offset+3,offsetY+digitHeight+5);
}



/*
REAN

01234567890123
xxxx    xxxx
xxxx  xxxx
xx        xx
xx  xxxxxx
xx    xxxxxx
xx  xx
xx      xx
xx    xx
xxxxxx  xx
xxxxxx    xx

*/
function drawROneWithOffset(offset, offsetY) {
    let barOneX = 0;
    let barTwoX = 8;
    g.fillRect(offset+barOneX,offsetY+0,offset+barOneX+3,offsetY+digitBarHeight);
    g.fillRect(offset+barTwoX,offsetY+0,offset+barTwoX+3,offsetY+digitBarHeight);
    //g.drawString("1",offset+2,offsetY+textHeight+5);
}

function drawRTwoWithOffset(offset, offsetY) {
    let barOneX = 0;
    let barTwoX = 6;
    g.fillRect(offset+barOneX,offsetY+0,offset+barOneX+3,offsetY+digitBarHeight);
    g.fillRect(offset+barTwoX,offsetY+0,offset+barTwoX+3,offsetY+digitBarHeight);
    //g.drawString("2",offset+2,offsetY+textHeight+5);
}

function drawRThreeWithOffset(offset, offsetY) {
    let barOneX = 0;
    let barTwoX = 10;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight);
    //g.drawString("3",offset+2,offsetY+textHeight+5);
}

function drawRFourWithOffset(offset, offsetY) {
    let barOneX = 0;
    let barTwoX = 4;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+5+offset,offsetY+digitBarHeight);
    //g.drawString("4",offset+2,offsetY+textHeight+5);
}

function drawRFiveWithOffset(offset, offsetY) {
    let barOneX = 0;
    let barTwoX = 6;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+5+offset,offsetY+digitBarHeight);
    //g.drawString("5",offset+2,offsetY+textHeight+5);
}

function drawRSixWithOffset(offset, offsetY) {
    let barOneX = 0;
    let barTwoX = 4;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight);
    //g.drawString("6",offset+2,offsetY+textHeight+5);
}

function drawRSevenWithOffset(offset, offsetY) {
    let barOneX = 0;
    let barTwoX = 8;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight);
    //g.drawString("7",offset+2,offsetY+textHeight+5);
}

function drawREightWithOffset(offset, offsetY) {
    let barOneX = 0;
    let barTwoX = 6;
    g.fillRect(offset+barOneX,offsetY+0,offset+barOneX+1,offsetY+digitBarHeight);
    g.fillRect(offset+barTwoX,offsetY+0,offset+barTwoX+1,offsetY+digitBarHeight);
    //g.drawString("8",offset+2,offsetY+textHeight+5);
}

function drawRNineWithOffset(offset, offsetY) {
    let barOneX = 0;
    let barTwoX = 8;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+5+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight);
    //g.drawString("9",offset+2,offsetY+textHeight+5);
}

function drawRZeroWithOffset(offset, offsetY) {
    let barOneX = 0;
    let barTwoX = 10;
    g.fillRect(barOneX+offset,offsetY+0,barOneX+5+offset,offsetY+digitBarHeight);
    g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight);
    //g.drawString("0",offset+2,offsetY+textHeight+5);
}

function drawCheckBar(offsetX, offsetY) {
    const barOneX = offsetX+2;
    const barOneWidth = 1;
    const barTwoX = offsetX+6;
    const barTwoWidth = 1;
    g.fillRect(barOneX,offsetY,barOneX+barOneWidth,offsetY+checkBarHeight);
    g.fillRect(barTwoX,offsetY,barTwoX+barTwoWidth,offsetY+checkBarHeight);
}

function calculateChecksum(digits) {
    let oddSum = digits[6] + digits[4] + digits[2] + digits[0];
    let evenSum = digits[5] + digits[3] + digits[1];

    let checkSum = (10 - ((3 * oddSum + evenSum) % 10)) % 10;

    return checkSum;
}

function storeStepCount() {
    stepCount = Bangle.getStepCount();
    require("Storage").writeJSON("stepCount",stepCount);
}

function getStepCount() {
    let accumulatedSteps = Bangle.getStepCount();
    if(accumulatedSteps <= stepCount) {
        return 0;
    }
    return accumulatedSteps - stepCount;
}

function resetAtMidnight() {
    let now = new Date();
    let night = new Date(
        now.getFullYear(),
        now.getMonth(),
        now.getDate(), // the next day, ...
        23, 58, 0 // ...at 00:00:00 hours
);
    let msToMidnight = night.getTime() - now.getTime();

    setTimeout(function() {
        storeStepCount();              //      <-- This is the function being called at midnight.
        resetAtMidnight();    //      Then, reset again next midnight.
    }, msToMidnight);
}

resetAtMidnight();

// The layout, referencing the custom renderer
var Layout = require("Layout");
var layout = new Layout( {
    type:"v", c: [
        {type:"custom", render:renderWatch, id:"watch", bgCol:g.theme.bg, fillx:1, filly:1 }
    ]
});

// Clear the screen once, at startup
g.clear();
Bangle.setUI("clock");
Bangle.loadWidgets();
Bangle.drawWidgets();
layout.render();

Bangle.on('lock', function(locked) {
    if(!locked) {
        layout.render();
    }
});
