#!/usr/bin/python3

import sys
import os
from tz_converter import main_widget
from tz_converter import timezone_info
from PySide.QtGui import QMainWindow, QApplication, QMessageBox, QAction, qApp, QIcon, QPixmap
from PySide.QtCore import QSettings, Qt


class TzInterface(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self)
        self.icon_path = '%s/share/tz-converter/icons' % sys.prefix
        self.setWindowTitle("Time Zone Converter")
        self.setGeometry(100, 100, 500, 300)
        self.settings = QSettings("Application", "TZ Converter")
        self.setup_menu()
        self.central_widget = main_widget.MainWidget()
        self.setCentralWidget(self.central_widget)

        # Set Icon
        self.appIcon = QIcon('%s/Saki-NuoveXT-Apps-world-clock.ico' % self.icon_path)
        self.setWindowIcon(self.appIcon)

        # Set Default as Global
        self.set_global.setChecked(True)

    def setup_menu(self):
        """
        # Setup the menu
        """
        self.create_actions()
        self.create_menus()
        # File menu
        self.file_menu.addAction(self.action_reset)
        self.file_menu.addAction(self.action_load)
        self.file_menu.addAction(self.action_save)
        self.file_menu.addSeparator()
        self.file_menu.addAction(self.action_quit)

        # Region Menu
        self.region_menu.addAction(self.set_africa)
        self.region_menu.addAction(self.set_america)
        self.region_menu.addAction(self.set_asia)
        self.region_menu.addAction(self.set_australia)
        self.region_menu.addAction(self.set_europe)
        self.region_menu.addAction(self.set_global)
        self.region_menu.addAction(self.set_pacific)
        self.region_menu.addAction(self.set_us)

        # Help menu
        self.help_menu.addAction(self.action_about_qt)
        self.help_menu.addAction(self.action_help)

    @staticmethod
    def about_help():
        help_box = QMessageBox()
        help_box.setTextFormat(Qt.RichText)
        help_box.setWindowTitle("TZ Converter")
        help_box.setIconPixmap(QPixmap('%s/Saki-NuoveXT-Apps-world-clock.ico' % self.icon_path))
        help_box.setText("<b>TZ Converter 1.0</b><br>A simple application for converting the time across time zones.")
        help_box.setInformativeText("Copyright 2014 David Maiorino<br><br>"
                                    "<a href='https://github.com/DMaiorino/tz_converter'>Fork me on Github!</a><br><br>"
                                    "Icon by Alexandre Moore: "
                                    "<a href='"
                                    "http://www.iconarchive.com/show/nuoveXT-icons-by-saki/Apps-world-clock-icon.html'>"
                                    "Iconarchive</a><br><br>"
                                    "This program comes with ABSOLUTELY NO WARRANTY<br>"
                                    "<a href='http://www.gnu.org/licenses/gpl.html'>"
                                    "http://www.gnu.org/licenses/gpl.html</a>")
        help_box.exec_()

    @staticmethod
    def quit_application():
        sys.exit()

    def reset_setting(self):
        self.set_timezone_region_global()
        self.central_widget.set_local_country()
        self.central_widget.set_local_time_one()

    # Create Actions for the menu
    def create_actions(self):
        self.action_help = QAction('About TZ Converter', self, statusTip="About Time Zone Converter",
                                   triggered=self.about_help)
        self.action_about_qt = QAction('About Qt', self, statusTip="Show the Qt Library's About Box",
                                       triggered=qApp.aboutQt)
        self.action_reset = QAction('Reset', self, statusTip="Reset Save/Load", shortcut="Ctrl+R",
                                    triggered=self.reset_setting)
        self.action_save = QAction('Save', self, statusTip="Save current times", shortcut="Ctrl+S",
                                   triggered=self.write_setting)
        self.action_load = QAction('Load', self, statusTip="Load saved times", shortcut="Ctrl+L",
                                   triggered=self.restore_setting)
        self.action_quit = QAction('Quit', self, statusTip="Quit Time Zone Converter", shortcut="Ctrl+Q",
                                   triggered=self.quit_application)
        self.set_us = QAction('US', self, statusTip="Set for US region", shortcut="Ctrl+U",
                              triggered=self.set_timezone_region_us, checkable=True)
        self.set_america = QAction('America', self, statusTip="Set for America region", shortcut="Ctrl+M",
                                   triggered=self.set_timezone_region_america, checkable=True)
        self.set_asia = QAction('Asia', self, statusTip="Set for Asia region", shortcut="Ctrl+A",
                                triggered=self.set_timezone_region_asia, checkable=True)
        self.set_africa = QAction('Africa', self, statusTip="Set for Africa region", shortcut="Ctrl+f",
                                  triggered=self.set_timezone_region_africa, checkable=True)
        self.set_australia = QAction('Australia', self, statusTip="Set for Australia region", shortcut="Ctrl+S",
                                     triggered=self.set_timezone_region_australia, checkable=True)
        self.set_europe = QAction('Europe', self, statusTip="Set for Europe region", shortcut="Ctrl+E",
                                  triggered=self.set_timezone_region_europe, checkable=True)
        self.set_pacific = QAction('Pacific', self, statusTip="Set for Pacific region", shortcut="Ctrl+P",
                                   triggered=self.set_timezone_region_pacific, checkable=True)
        self.set_global = QAction('Global', self, statusTip="Set for Global region", shortcut="Ctrl+G",
                                  triggered=self.set_timezone_region_global, checkable=True)

    # Actual menu bar item creation
    def create_menus(self):
        """
        Create the actual menu bar
        """
        self.file_menu = self.menuBar().addMenu("File")
        self.region_menu = self.menuBar().addMenu("Region")
        self.help_menu = self.menuBar().addMenu("Help")

    # Set Region functions
    def set_timezone_region_us(self):
        self.remove_all_checks()
        self.central_widget.clear_combo_boxes()
        self.central_widget.time_one_country_combobox.addItems(timezone_info.get_us_timezone_list())
        self.central_widget.time_two_country_combobox.addItems(timezone_info.get_us_timezone_list())
        self.central_widget.convert_timeone_to_timetwo()
        self.set_us.setChecked(True)

    def set_timezone_region_america(self):
        self.remove_all_checks()
        self.central_widget.clear_combo_boxes()
        self.central_widget.time_one_country_combobox.addItems(timezone_info.get_america_timezone_list())
        self.central_widget.time_two_country_combobox.addItems(timezone_info.get_america_timezone_list())
        self.central_widget.convert_timeone_to_timetwo()
        self.set_america.setChecked(True)

    def set_timezone_region_asia(self):
        self.remove_all_checks()
        self.central_widget.clear_combo_boxes()
        self.central_widget.time_one_country_combobox.addItems(timezone_info.get_asia_timezone_list())
        self.central_widget.time_two_country_combobox.addItems(timezone_info.get_asia_timezone_list())
        self.central_widget.convert_timeone_to_timetwo()
        self.set_asia.setChecked(True)

    def set_timezone_region_africa(self):
        self.remove_all_checks()
        self.central_widget.clear_combo_boxes()
        self.central_widget.time_one_country_combobox.addItems(timezone_info.get_africa_timezone_list())
        self.central_widget.time_two_country_combobox.addItems(timezone_info.get_africa_timezone_list())
        self.central_widget.convert_timeone_to_timetwo()
        self.set_africa.setChecked(True)

    def set_timezone_region_australia(self):
        self.remove_all_checks()
        self.central_widget.clear_combo_boxes()
        self.central_widget.time_one_country_combobox.addItems(timezone_info.get_australia_timezone_list())
        self.central_widget.time_two_country_combobox.addItems(timezone_info.get_australia_timezone_list())
        self.central_widget.convert_timeone_to_timetwo()
        self.set_australia.setChecked(True)

    def set_timezone_region_europe(self):
        self.remove_all_checks()
        self.central_widget.clear_combo_boxes()
        self.central_widget.time_one_country_combobox.addItems(timezone_info.get_europe_timezone_list())
        self.central_widget.time_two_country_combobox.addItems(timezone_info.get_europe_timezone_list())
        self.central_widget.convert_timeone_to_timetwo()
        self.set_europe.setChecked(True)

    def set_timezone_region_pacific(self):
        self.remove_all_checks()
        self.central_widget.clear_combo_boxes()
        self.central_widget.time_one_country_combobox.addItems(timezone_info.get_pacific_timezone_list())
        self.central_widget.time_two_country_combobox.addItems(timezone_info.get_pacific_timezone_list())
        self.central_widget.convert_timeone_to_timetwo()
        self.set_pacific.setChecked(True)

    def set_timezone_region_global(self):
        self.remove_all_checks()
        self.central_widget.clear_combo_boxes()
        self.central_widget.time_one_country_combobox.addItems(timezone_info.get_global_timezone_list())
        self.central_widget.time_two_country_combobox.addItems(timezone_info.get_global_timezone_list())
        self.central_widget.convert_timeone_to_timetwo()
        self.set_global.setChecked(True)

    def get_checked_region(self):
        if self.set_africa.isChecked():
            return "Africa"
        elif self.set_us.isChecked():
            return "US"
        elif self.set_america.isChecked():
            return "America"
        elif self.set_asia.isChecked():
            return "Asia"
        elif self.set_australia.isChecked():
            return "Australia"
        elif self.set_europe.isChecked():
            return "Europe"
        elif self.set_pacific.isChecked():
            return "Pacific"
        else:
            return "Global"

    def set_checked_region(self, region):
        self.remove_all_checks()
        if region == "Africa":
            self.set_timezone_region_africa()
        elif region == "US":
            self.set_timezone_region_us()
        elif region == "America":
            self.set_timezone_region_america()
        elif region == "Asia":
            self.set_timezone_region_asia()
        elif region == "Australia":
            self.set_timezone_region_australia()
        elif region == "Europe":
            self.set_timezone_region_europe()
        elif region == "Pacific":
            self.set_timezone_region_pacific()
        else:
            self.set_timezone_region_global()

    def remove_all_checks(self):
        self.set_africa.setChecked(False)
        self.set_us.setChecked(False)
        self.set_america.setChecked(False)
        self.set_asia.setChecked(False)
        self.set_australia.setChecked(False)
        self.set_europe.setChecked(False)
        self.set_pacific.setChecked(False)
        self.set_global.setChecked(False)

    def write_setting(self):
        self.settings = QSettings("Application", "TZ Converter")
        self.settings.beginGroup("Time")
        self.settings.setValue("selected region", self.central_widget.time_one_time_edit.time())
        self.settings.setValue("time_one", self.central_widget.time_one_time_edit.time())
        self.settings.setValue("time_one_calender", self.central_widget.time_one_calendar.selectedDate())
        self.settings.setValue("Combo One", self.central_widget.time_one_country_combobox.currentIndex())
        self.settings.setValue("region", self.get_checked_region())
        self.settings.setValue("Combo Two", self.central_widget.time_two_country_combobox.currentIndex())
        self.settings.endGroup()

    def restore_setting(self):
        self.settings.beginGroup("Time")
        self.set_checked_region(self.settings.value("region"))
        self.central_widget.time_one_country_combobox.setCurrentIndex(int(self.settings.value("Combo One")))
        self.central_widget.time_two_country_combobox.setCurrentIndex(int(self.settings.value("Combo Two")))
        self.central_widget.time_one_time_edit.setTime(self.settings.value("time_one"))
        self.central_widget.time_one_calendar.setSelectedDate(self.settings.value("time_one_calender"))
        self.settings.endGroup()

        # Once values are set, run the time conversion.
        self.central_widget.convert_timeone_to_timetwo()


if __name__ == '__main__':
    try:
        my_app = QApplication(sys.argv)
        main_window = TzInterface()
        main_window.show()
        my_app.exec_()
        sys.exit(0)
    except NameError:
        print("Name Error:", sys.exc_info()[1])
    except SystemExit:
        print("Closing Window...")
