import QtQuick 2.0
 import "components"
 import QtSensors 5.0
 
 import "lib.js" as Lib
 ApplicationWindow {
     id: mainWnd
     property Mouse mouseCtrl;
     property LabyrinthSquare cheeseSquare;
     property Congratulation congratulation;
     Rectangle {
         id: gameRect
         x: (mainWnd.width - width) / 2
         y: 25
         width: Lib.dimension * Lib.cellDimension
         height: Lib.dimension * Lib.cellDimension
         color: "transparent"
         border.width: 2
         
         Timer {
             id: startTimer
             interval: 50; running: true; repeat: false
             onTriggered: {
                 
                 timePlayingLabel.text = "--";
                 Lib.sec = 0.0;
                 Lib.createLabyrinth();
                 
                 var needloadcomponent = false;
                 if (Lib.objectArray === null){
                     needloadcomponent = true;
                     Lib.objectArray = new Array(Lib.dimension * Lib.dimension);
                 }
                 var idx = 0;
                 for (var y = 0; y < Lib.dimension; y++ ){
                     for (var x = 0; x < Lib.dimension; x++ ){
                         var component = null;
                         
                         if (needloadcomponent){
                             component = Qt.createComponent("LabyrinthSquare.qml");
                             if (component.status == Component.Ready) {
                                 var square = component.createObject(parent);
                                 square.x = x * square.width;
                                 square.y = y * square.height;
                                 square.val = Lib.labyrinth[x][y];
                                 square.updateImage();
                                 Lib.objectArray[idx] = square;
                                 if (x == (Lib.dimension - 1) && y == (Lib.dimension - 1)){
                                     cheeseSquare = square;
                                     var component1 = Qt.createComponent("Congratulation.qml");
                                     if (component1.status == Component.Ready) {
                                         congratulation = component1.createObject(parent);
                                         congratulation.visible = false;
                                     }
                                 }
                             }
                         }
                         else{
                             Lib.objectArray[idx].val = Lib.labyrinth[x][y];
                             Lib.objectArray[idx].updateImage();
                             if (x == (Lib.dimension - 1) && y == (Lib.dimension - 1)){
                                 cheeseSquare = Lib.objectArray[idx];
                                 congratulation.visible = false;
                             }
                         }
                         idx++;
                     }
                 }
                 
                 
                 if (mouseCtrl === null){
                     var component = Qt.createComponent("Mouse.qml");
                     if (component.status == Component.Ready) {
                         mouseCtrl = component.createObject(parent);
                     }
                 }
                 mouseCtrl.x = 0;
                 mouseCtrl.y = 0;
                 newGameButton.enabled = true;
                 
                 tiltTimer.running = true;
                 tiltSensor.calibrate();
             }
         }
     }
     TiltSensor{
         id: tiltSensor
         unit: TiltSensor.Degrees
         enabled: true
         accuracy: 5.0
     }
     
     Timer {
         id: tiltTimer
         interval: 50; running: false; repeat: true
         onTriggered: {
             if (!tiltSensor.enabled)
                 tiltSensor.enabled = true;
             if (mouseCtrl === null)
                 return;
             
             if (Lib.won !== true){
                 Lib.sec += 0.05;
                 timePlayingLabel.text = Math.floor(Lib.sec) + " seconds";
                 
                 var xval = -1;
                 var yval = -1;
                 var xstep = 0;
                 if (tiltSensor.yRotation > 0)
                     xstep = 1;
                 else if (tiltSensor.yRotation < 0)
                     xstep = -1;
                 var ystep = 0;
                 if (tiltSensor.xRotation > 0)
                     ystep = 1;
                 else if (tiltSensor.xRotation < 0)
                     ystep = -1;
                 if (xstep < 0){
                     if (mouseCtrl.x > 0){
                         if (Lib.canMove(mouseCtrl.x + xstep, mouseCtrl.y)){
                             xval = mouseCtrl.x + xstep;
                         }
                     }
                 }
                 else if (xstep > 0){
                     if (mouseCtrl.x < (Lib.cellDimension * (Lib.dimension - 1))){
                         if (Lib.canMove(mouseCtrl.x + xstep, mouseCtrl.y)){
                             xval = mouseCtrl.x + xstep;
                         }
                     }
                 }
                 if (ystep < 0){
                     if (mouseCtrl.y > 0){
                         if (Lib.canMove(mouseCtrl.x, mouseCtrl.y + ystep)){
                             yval = mouseCtrl.y + ystep;
                         }
                     }
                 }
                 else if (ystep > 0){
                     if (mouseCtrl.y < (Lib.cellDimension * (Lib.dimension - 1))){
                         if (Lib.canMove(mouseCtrl.x, mouseCtrl.y + ystep)){
                             yval = mouseCtrl.y + ystep;
                         }
                     }
                 }
                 if (xval >= 0 && yval >= 0)
                     mouseCtrl.move(xval, yval);
                 
                 else{
                     if (xval >= 0){
                         mouseCtrl.move(xval, mouseCtrl.y);
                     }
                     if (yval >= 0){
                         mouseCtrl.move(mouseCtrl.x, yval);
                     }
                 }
             }
             else{
                 
                 mainWnd.cheeseSquare.val = 4;
                 mainWnd.cheeseSquare.updateImage();
                 mainWnd.congratulation.visible = true;
                 newGameButton.enabled = true;
                 tiltTimer.running = false;
             }
         }
     }
     
     Button{
         id: newGameButton
         anchors.left: gameRect.left
         anchors.top: gameRect.bottom
         anchors.topMargin: 5
         height: 30
         width: 100
         text: "new game"
         enabled: false;
         onClicked: {
             newGameButton.enabled = false;
             startTimer.start();
         }
     }
     
     Text{
         id: timePlayingLabel
         anchors.right: gameRect.right
         anchors.top: gameRect.bottom
         anchors.topMargin: 5
     }
 }