// properties:
// -----------
// server - selected server name)
// serverUrl - Url of the selected server
// stations - Number of stations in selected server
// tags - Number of tags in selected server
// countries - Number of countries in selected server
// count - Number of servers in model
// model - Model containing list of servers (if you want to manually choose server)
// --------------------------------------------------------------------------------
// functions:
// ----------
// getList - Refresh the ListModel and add a random url to server
// getRandom - Get a random url from the ListModel and add url to server
// ---------------------------------------------------------------------
import QtQuick 2.0
import "../models"

Item {
    property string _useragent: "AllRadio/2.0.0 (test) (SailfishOS; Linux) nesnomis@gmail.com"
    property int _tags: 0
    property int _countries: 0
    property int _c: 0

    // Properties to be used in application -------------------------------------------------
    property ListModel serversModel : ListModel { id: serversModel }
    property ListModel serverStatsModel : ListModel { id: serverStatsModel }
    property ListModel votedModel : ListModel {id: votedModel}
    property CountryListModel countriesModel : CountryListModel {id:countriesModel}
    //property TagListModel tagsModel : TagListModel {id:tagsModel}
    property string serverUrl: ""
    property string server: ""
    property bool online: false
    property bool voted: false
    property int stationCount: 0
    property int tagCount: 0
    //property int viewTagCount: tagsModel.maxCount
    property int countryCount: 0
    property bool loading: stationCount !== 0 && tagCount !== 0 && countryCount !== 0 ? false : true
    property int serverIndex: 0
    property int connectIndex: -1
    property string lookup: sModel.get(serverIndex).url //"http://fi2.api.radio-browser.info/json/servers"
    // ---------------------------------------------------------------------------------------
    Timer {
        id: sTimer
        interval: 2000; running: false; repeat: false
        onTriggered: {
            if (serverIndex < sModel.count-1) serverIndex = serverIndex + 1; else serverIndex = 0
            getList()
        }
    }
    //onServerIndexChanged: console.log(" ******* LOOKUP ******** ")+serverIndex

    ListModel {
        id: sModel

        ListElement {
            name: "all.api.radio-browser.info"
            url: "http://all.api.radio-browser.info/json/servers"
        }
        ListElement {
            name: "de1.api.radio-browser.info"
            url: "http://de1.api.radio-browser.info/json/servers"
        }
        ListElement {
            name: "de2.api.radio-browser.info"
            url: "http://de2.api.radio-browser.info/json/servers"
        }
        ListElement {
            name: "fi1.api.radio-browser.info"
            url: "http://fi1.api.radio-browser.info/json/servers"
        }
        ListElement {
            name: "fi3.api.radio-browser.info"
            url: "http://fi3.api.radio-browser.info/json/servers"
        }
    }

    onOnlineChanged: {
        if (online && serverUrl !== "") {
            countriesModel.source = serverUrl  + "/xml/countrycodes?hidebroken=true"
        }
    }
    // Not used?!?!?
  /*  function getServer(s,u) {
        stationCount = 0
        tagCount = 0
        countryCount = 0
        server = s
        serverUrl = u
        getStats()
    } */

    function connectServer(index) {
        if (serversModel.count > 0) {

            server = serversModel.get(index).server
            if (serverUrl.length > 7 && url !== serverUrl) {loading=true;serverIndex = index;sTimer.running=false;getStats();} else {loading=true;serverIndex = index;getRandom();}
        }
    }
    // Choose a random server from available servers
    function getRandom(url) {
        if (serversModel.count > 0) {
            var random = Math.floor((Math.random() * serversModel.count) + 1) - 1
            serverUrl = serversModel.get(random).serverUrl
            server = serversModel.get(random).server
            if (serverUrl.length > 7 && url !== serverUrl) {sTimer.running=false;getStats();serverIndex=random} else getRandom();
        }
    }

    // Get a list of available Radio Community Servers.
    function getList() {
        var req = new XMLHttpRequest();
        req.onreadystatechange = function () {
            if (req.readyState === 4 && req.status < 300) {

                var obj = JSON.parse(req.responseText)
                serversModel.clear()
                for (var key in obj) {
                    addIfNotExist(obj[key])
                }
                sTimer.running = false
                //console.log(" *** lookup *** "+serverIndex+": "+lookup)
                getRandom(lookup)
            } else if (req.readyState === 4 && req.status > 299) {
                if (serverIndex < sModel.count-1) serverIndex=serverIndex+1; else serverIndex=0;
                lookup=sModel.get(serverIndex).url
                //console.log(" *** lookup *** "+serverIndex+": "+lookup)
                getList();
            }
        };
        sTimer.running = true
        //console.log(" *** START : "+lookup)
        req.open("get", lookup);
        req.setRequestHeader('User-Agent',_useragent);
        req.send();
    }
    // Add available server to listmodel
    function addIfNotExist(server) {
        for (var i = 0; i < serversModel.count; i++) {
            if (serversModel.get(i).server === server.name) {
                return
            }
        }
        serversModel.append({"serverUrl": "http://"+server.name,"server": server.name})
    }
    // ----------------------------------------------
    // Station online?
    function getStats() {
        var req = new XMLHttpRequest();
        req.onreadystatechange = function () {
            if (req.readyState === 4 && req.status < 300) {
                var obj = req.response.split("{").pop();
                obj = JSON.parse("{"+obj)
                if (obj.status === "OK") {
                    stationCount = obj.stations-obj.stations_broken
                    tagCount = obj.tags
                    if (obj.status === "OK") {online = true} else {online = false}
                }
            }
        };
        req.open("get", serverUrl+"/json/stats");
        req.setRequestHeader('User-Agent',_useragent);
        req.send();
    }
    // ----------------------------------------------
    // Vote/like for radio station on community radio browser.
    function upVote(stationuuid,returnValue) {
        var req = new XMLHttpRequest();
        var ret = false
        req.onreadystatechange = function () {
            if (req.readyState === 4 && req.status === 200) {
                var obj = req.response.split("{").pop();
                obj = JSON.parse("{"+obj)
                if (obj.ok) {
                    if (obj.ok) {returnValue=true;console.log(" ****** VOTED *****")} else {returnValue=false;console.log(" ****** NOT VOTED *****")}
                }
                return ret
            }
        };
        req.open("get", serverUrl+"/json/vote/"+stationuuid);
        req.setRequestHeader('User-Agent',_useragent);
        req.send();
    }
    // ----------------------------------------------
    // Load model with country names.
    CountryNameModel {id: countryNameModel}

    function getCountryName(land) {  // Get translated countryname
        for(var i = 0; i < countryNameModel.count; i++) {
            var current = countryNameModel.get(i);
            if(land === current.code) {
                return countryNameModel.countryname(i)
            }
        }
    }
}