/**
    Copyright (C) 2024 Samuel Jimenez <therealsamueljimenez@gmail.com>
          Ported the Luna Plasmoid to Plasma 6.

    Copyright 2016 Bill Binder <dxtwjb@gmail.com>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, see <http://www.gnu.org/licenses/>.
*/

import QtPositioning
import QtQuick 2.7
import QtQuick.Controls as QtControls
import QtQuick.Dialogs as QtDialogs
import QtQuick.Layouts as QtLayouts
import org.kde.kcmutils as KCM
import org.kde.kirigami as Kirigami
import org.kde.plasma.plasma5support as Plasma5Support

KCM.SimpleKCM {
    id: generalPage

    property alias cfg_latitudeAuto: latitudeAuto.checked // 0=Equator, +90=North Pole, -90=South Pole
    property alias cfg_latitude: latitude.value // 0=Equator, +90=North Pole, -90=South Pole
    property alias cfg_phase: phase.value
    property alias cfg_transparentShadow: transparentShadow.checked // boolean
    property alias cfg_showBackground: showBackground.checked // boolean
    property alias cfg_dateFormat: dateFormat.currentIndex // code: 0= 1= 2=...
    property alias cfg_dateFormatString: dateFormatString.text
    property alias cfg_diskColor: diskColor.color
    property int cfg_lunarIndex: 0 // index into imageChoices
    property string cfg_lunarImage: '' // filename (from imageChoices)
    property int cfg_lunarImageTweak: 0 // rotation angle adjustment for the image (from imageChoices)
    property alias cfg_showShadow: showShadow.checked
    property alias cfg_showGrid: showGrid.checked
    property alias cfg_showTycho: showTycho.checked
    property alias cfg_showCopernicus: showCopernicus.checked

    onCfg_lunarIndexChanged: {
        cfg_lunarImage = imageChoices.get(cfg_lunarIndex).filename;
        cfg_lunarImageTweak = imageChoices.get(cfg_lunarIndex).tweak;
    }

    PositionSource {
        id: geoSource

        readonly property bool locating: geoSource.active && geoSource.sourceError == PositionSource.NoError && !(geoSource.position.latitudeValid)

        updateInterval: 3600 * 1000
        active: cfg_latitudeAuto
        onPositionChanged: {
            // lbl_place.text = i18n(geoSource.data.location.country);
            cfg_latitude = Math.round(geoSource.position.coordinate.latitude * 100) / 100;
        }
    }

    ImageChoices {
        id: imageChoices
    }

    QtDialogs.ColorDialog {
        id: colorDialog

        title: i18n("Pick a color for the moon")
        visible: false
        selectedColor: diskColor.color
        onAccepted: diskColor.color = selectedColor
    }

    QtLayouts.GridLayout {
        columns: 2
        rowSpacing: 15

        QtControls.Label {
            text: i18n("Preview")
        }

        QtLayouts.RowLayout {
            spacing: 20

            QtControls.Button {
                id: previousButton

                icon.source: "go-previous"
                enabled: cfg_lunarIndex > 0
                onClicked: {
                    cfg_lunarIndex -= 1;
                }
            }

            LunaIcon {
                id: lunaPreview

                width: 200
                height: 200
                latitude: cfg_latitude
                theta: cfg_phase
                showShadow: cfg_showShadow
                transparentShadow: false
                lunarImage: cfg_lunarImage
                lunarImageTweak: cfg_lunarImageTweak
                diskColor: cfg_diskColor
                showGrid: cfg_showGrid
                showTycho: cfg_showTycho
                showCopernicus: cfg_showCopernicus
            }

            QtControls.Button {
                id: nextButton

                icon.source: "go-next"
                enabled: cfg_lunarIndex < imageChoices.count - 1
                onClicked: {
                    cfg_lunarIndex += 1;
                }
            }

            QtLayouts.ColumnLayout {
                spacing: 20

                QtControls.CheckBox {
                    id: showShadow

                    text: i18n("Show shadow")
                }

                QtControls.CheckBox {
                    id: showGrid

                    text: i18n("Show grid")
                }

                QtControls.CheckBox {
                    id: showTycho

                    text: i18n("Tycho")
                }

                QtControls.CheckBox {
                    id: showCopernicus

                    text: i18n("Copernicus")
                }

            }

        }

        QtControls.Label {
            text: i18n("Disk Color")
            visible: cfg_lunarImage === ""
        }

        Rectangle {
            id: diskColor

            width: 50
            height: 50
            color: '#808040'
            border.color: '#000000'
            radius: height / 2
            visible: cfg_lunarImage === ""

            MouseArea {
                anchors.fill: parent
                onClicked: {
                    colorDialog.selectedColor = diskColor.color;
                    colorDialog.visible = true;
                }
            }

        }

        QtControls.Label {
            text: i18n("Latitude")
        }

        QtLayouts.RowLayout {
            spacing: 20

            QtControls.Label {
                id: lbl_latitude

                text: Math.abs(latitude.value) + "º " + (latitude.value < 0 ? "S" : "N")
                QtLayouts.Layout.preferredWidth: 40
                horizontalAlignment: Text.AlignRight
            }

            QtControls.Slider {
                id: latitude

                QtLayouts.Layout.fillWidth: true
                from: -90
                to: 90
                stepSize: 5
                enabled: !cfg_latitudeAuto
            }

        }

        QtControls.Label {
        }

        QtLayouts.RowLayout {
            spacing: 20

            QtControls.CheckBox {
                id: latitudeAuto

                text: i18n("Use current latitude")
            }

            QtControls.Label {
                id: lbl_place

                QtLayouts.Layout.fillWidth: true
                horizontalAlignment: Text.AlignRight
            }

        }

        QtControls.Label {
            text: i18n("Phase Preview")
            QtLayouts.Layout.preferredWidth: 85
            horizontalAlignment: Text.AlignRight
        }

        QtLayouts.RowLayout {
            spacing: 20

            QtControls.Label {
                id: lbl_phase

                text: Math.abs(phase.value) + "º "
                QtLayouts.Layout.preferredWidth: 40
                horizontalAlignment: Text.AlignRight
            }

            QtControls.Slider {
                id: phase

                value: lunaPreview.theta
                QtLayouts.Layout.fillWidth: true
                from: 0
                to: 360
                stepSize: 1
            }

        }

        QtControls.Label {
            text: i18n("Date Format")
        }

        QtControls.ComboBox {
            id: dateFormat

            QtLayouts.Layout.fillWidth: true
            textRole: "key"

            model: ListModel {
                dynamicRoles: true
                Component.onCompleted: {
                    append({
                        "key": i18n("Text date"),
                        "value": 0
                    });
                    append({
                        "key": i18n("Short date"),
                        "value": 1
                    });
                    append({
                        "key": i18n("Long date"),
                        "value": 2
                    });
                    append({
                        "key": i18n("ISO date"),
                        "value": 3
                    });
                    append({
                        "key": i18n("Custom"),
                        "value": 4
                    });
                }
            }

        }

        QtControls.Label {
            text: i18n("Date Format String")
            visible: dateFormat.currentIndex == 4
        }

        QtControls.TextField {
            id: dateFormatString

            maximumLength: 24
            visible: dateFormat.currentIndex == 4
        }

        QtControls.Label {
            text: i18n("Background")
        }

        QtControls.CheckBox {
            id: showBackground

            text: i18n("Show background")
        }

        QtControls.Label {
            text: ""
        }

        QtControls.CheckBox {
            id: transparentShadow

            text: i18n("Transparent shadow")
        }

    }

}