#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Silaty
#
# Copyright (c) 2018 - 2019 AXeL
# Copyright (c) 2014 - 2015 Jessewb786
#
# TODO: Help document
# TODO: Good Code Documentation

import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, GObject, Gio, GLib, Gdk, GdkPixbuf
from gi.repository import AppIndicator3 as AI
from datetime import date
from hijrical import *
from silaty import *
from translate import translate_text as _
import locale
import sys

locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

class SilatyIndicator():
	def __init__(self):
		# Setup Indicator Applet
		self.Indicator = AI.Indicator.new("silaty-indicator", "silaty-indicator", AI.IndicatorCategory.APPLICATION_STATUS)
		self.Indicator.set_status(AI.IndicatorStatus.ACTIVE)
		self.Indicator.set_icon(self.icon())

		# Activate the Silaty Window
		self.silaty = Silaty(self)

		self.silaty.prayertimes.calculate()
		print ("DEBUG: Silaty started! @", (str(datetime.datetime.now())))
		print ("DEBUG: started prayer times report: @", (str(datetime.datetime.now())))
		self.silaty.prayertimes.report()
		print ("DEBUG: end of report @", (str(datetime.datetime.now())))

		# Setup the Menu
		print ("DEBUG: initialize the menu @", (str(datetime.datetime.now())))
		self.Menu = Gtk.Menu()

		# Add Hijri date
		print ("DEBUG: Adding hijri date to menu @", (str(datetime.datetime.now())))
		self.HijriDateItem = Gtk.MenuItem(self.get_hijri_date())
		self.HijriDateItem.connect("activate", self.show_home)
		self.Menu.append(self.HijriDateItem)
		self.Menu.append(Gtk.SeparatorMenuItem())

		# Add City
		print ("DEBUG: Adding city to menu @", (str(datetime.datetime.now())))
		self.CityItem = Gtk.MenuItem(_("Location: %s") % self.silaty.prayertimes.options.city, sensitive=False)
		self.Menu.append(self.CityItem)

		# Add Qibla Direction
		print ("DEBUG: Adding qibla direction to menu @", (str(datetime.datetime.now())))
		self.QiblaItem = Gtk.MenuItem(_("Qibla is %.2f° from True North") % self.silaty.prayertimes.get_qibla())
		self.QiblaItem.connect("activate", self.show_qibla)
		self.Menu.append(self.QiblaItem)
		self.Menu.append(Gtk.SeparatorMenuItem())

		# Add Prayer Times
		print ("DEBUG: Adding the prayer times to menu @", (str(datetime.datetime.now())))
		self.FajrItem     = Gtk.MenuItem(_("Fajr\t\t\t\t\t%s") % self.silaty.get_times(self.silaty.prayertimes.fajr_time()), sensitive=False)
		#self.ShurukItem   = Gtk.MenuItem(_("Shuruk\t\t\t\t%s") % self.silaty.get_times(self.silaty.prayertimes.shrouk_time()), sensitive=False)
		self.DhuhrItem    = Gtk.MenuItem(_("Dhuhr\t\t\t\t\t%s") % self.silaty.get_times(self.silaty.prayertimes.zuhr_time()), sensitive=False)
		self.AsrItem      = Gtk.MenuItem(_("Asr\t\t\t\t\t%s") % self.silaty.get_times(self.silaty.prayertimes.asr_time()), sensitive=False)
		self.MaghribItem  = Gtk.MenuItem(_("Maghrib\t\t\t\t%s") % self.silaty.get_times(self.silaty.prayertimes.maghrib_time()), sensitive=False)
		self.IshaItem     = Gtk.MenuItem(_("Isha\t\t\t\t\t%s") % self.silaty.get_times(self.silaty.prayertimes.isha_time()), sensitive=False)
		self.Menu.append(self.FajrItem)
		#self.Menu.append(self.ShurukItem)
		self.Menu.append(self.DhuhrItem)
		self.Menu.append(self.AsrItem)
		self.Menu.append(self.MaghribItem)
		self.Menu.append(self.IshaItem)
		self.Menu.append(Gtk.SeparatorMenuItem())

		print ("DEBUG: Adding Next prayer to menu @", (str(datetime.datetime.now())))
		self.NextPrayerItem = Gtk.MenuItem(_('Next Prayer'), sensitive=False)# Next PrayerTime's Item, it shows you information about the next prayer
		self.Menu.append(self.NextPrayerItem)
		self.Menu.append(Gtk.SeparatorMenuItem())

		print ("DEBUG: Adding About, Settings and Quit to menu @", (str(datetime.datetime.now())))
		# The Last 3 menu items never change and don't need to be updated
		AboutItem = Gtk.MenuItem(_('About'))
		self.Menu.append(AboutItem)
		AboutItem.connect('activate',self.about_dialog, None)

		SettingsItem = Gtk.MenuItem(_('Settings'))
		self.Menu.append(SettingsItem)
		SettingsItem.connect('activate', self.show_settings, None)

		ExitItem = Gtk.MenuItem(_('Quit'))
		self.Menu.append(ExitItem)
		ExitItem.connect('activate', self.quit)

		print ("DEBUG: starting mainloop @", (str(datetime.datetime.now())))
		self.currentprayer = self.silaty.prayertimes.next_prayer()
		self.loop()# Run Application's loop
		self.Menu.show_all()# Show All Items
		self.Indicator.set_menu(self.Menu)# Assign Menu To Indicator
		self.Gobjectloop = GLib.timeout_add_seconds(1, self.loop)# Run loop

	def loop(self):
		global NextPrayerDT
		self.silaty.prayertimes.calculate()# Calculate PrayerTimes

		# Update City menu item
		self.CityItem.set_label(_("Location: %s") % self.silaty.prayertimes.options.city)

		# Update Hijri Date Menu item
		self.HijriDateItem.set_label(self.get_hijri_date())

		# Update Qibla Menu item
		self.QiblaItem.set_label(_("Qibla is %.2f° from True North") % self.silaty.prayertimes.get_qibla())

		# Update Prayer Times items
		self.FajrItem.set_label(_("Fajr\t\t\t\t\t%s") % self.silaty.get_times(self.silaty.prayertimes.fajr_time()))
		#self.ShurukItem.set_label(_("Shuruk\t\t\t\t%s") % self.silaty.get_times(self.silaty.prayertimes.shrouk_time()))
		self.DhuhrItem.set_label(_("Dhuhr\t\t\t\t\t%s") % self.silaty.get_times(self.silaty.prayertimes.zuhr_time()))
		self.AsrItem.set_label(_("Asr\t\t\t\t\t%s") % self.silaty.get_times(self.silaty.prayertimes.asr_time()))
		self.MaghribItem.set_label(_("Maghrib\t\t\t\t%s") % self.silaty.get_times(self.silaty.prayertimes.maghrib_time()))
		self.IshaItem.set_label(_("Isha\t\t\t\t\t%s") % self.silaty.get_times(self.silaty.prayertimes.isha_time()))

		nextprayer = self.silaty.prayertimes.next_prayer()
		tonextprayer = self.silaty.prayertimes.time_to_next_prayer()

		# Update displayed prayer
		if (nextprayer != self.currentprayer) and self.silaty.is_visible():
			self.silaty.homebox.emit("prayers-updated", _(nextprayer))
			self.currentprayer = nextprayer

		self.NextPrayerItem.set_label(_("%s until %s") % (self.secs_to_hrtime(tonextprayer.seconds), _(nextprayer)))
		self.silaty.headerbar.set_title(_("%s until %s") % (self.secs_to_hrtime(tonextprayer.seconds), _(nextprayer)))
		self.Indicator.set_title(_("%s in %s") % (_(nextprayer), (self.secs_to_nrtime(tonextprayer.seconds))))

		if self.silaty.prayertimes.options.iconlabel == True:
			self.Indicator.set_label(_("%s in %s") % (_(nextprayer), (self.secs_to_nrtime(tonextprayer.seconds))),"")
		else:
			self.Indicator.set_label("","")
		return True

	def secs_to_hrtime(self, secs):
		# Transform Seconds into Hours and Minutes
		hours = secs//3600
		minutes = (secs//60)%60
		minutes += 1 # correct minutes (to avoid values like "0min")
		if minutes == 60:
			hours += 1
			return _("%s Hours") % str(hours)
		elif hours == 0:
			return _("%s Minutes") % str(minutes)
		else:
			return _("%s Hours and %s Minutes") % (str(hours), str(minutes))

	def secs_to_nrtime(self, secs):
		# Transform Seconds into Hours and Minutes
		# Using the same standard in iPray
		hours = secs//3600
		minutes = (secs//60)%60
		minutes += 1 # correct minutes (to avoid values like "0min")
		if minutes == 60:
			hours += 1
			return _("%shr") % str(hours)
		elif hours == 0:
			return _("%smin") % str(minutes)
		else:
			return _("%shr %smin") % (str(hours), str(minutes))

	def icon(self):
		# Get Icon
		print ("DEBUG: getting Icons @", (str(datetime.datetime.now())))
		PathDir = os.path.dirname(os.path.realpath(__file__)) + "/icons/hicolor/scalable/silaty-indicator.svg"
		#print (PathDir)

		if os.path.exists(PathDir):
			print ("DEBUG: icon found in the OS @", (str(datetime.datetime.now())))
			return PathDir

		else:
			print ("ERROR: Cannot find icon : silaty-indicator.svg @ %s" % (str(datetime.datetime.now())), file=sys.stderr)
			print ("DEBUG: silaty-indicator QUITING @", (str(datetime.datetime.now())))
			sys.exit(1)

	def get_hijri_date(self):
		wd = datetime.datetime.now().strftime("%A")
		calc = HijriCal(self.silaty.prayertimes.options.hijrical_adjustment)
		h_months = ['Muharram ', 'Safar', 'Rabi al Awwal', 'Rabi al Akhira', 'Jumada al Ula', 'Jumada al Akhira', 'Rajab', "Sha'ban", 'Ramadan', 'Shawwal', "Dhu al Qa'da", 'Dhu al Hijja']
		h_year,  h_month,  h_day,  h_week_day = calc.today
		h_date = '%i %s %i' % ( h_day,  _(h_months[int(h_month-1)]),  h_year)
		return (_('%s, %s') % (_(wd), h_date))

	def show_home(self, widget):
		self.show_window("home")

	def show_qibla(self, widget):
		self.show_window("qibla")

	def show_settings(self, widget, data):
		self.show_window("options")

	def show_window(self, active_tab_name):
		# Show main window
		#print ('DEBUG: window is visible: %s, active: %s' % (self.silaty.is_visible(), self.silaty.is_active()))
		if not self.silaty.is_visible():
			self.silaty.show_all()
		elif not self.silaty.is_active():
			self.silaty.present()
		# Set active tab
		current_tab_name = self.silaty.sidebar.stack.get_visible_child_name()
		if (current_tab_name != active_tab_name):
			# If another tab was activated before, set its state to OFF
			index = self.silaty.sidebar.stackchildnames.index(current_tab_name)
			self.silaty.sidebar.get_child(index).state = SideBarButtonState.OFF
		# Activate/show new tab
		self.silaty.sidebar.stack.set_visible_child_name(active_tab_name)
		self.silaty.sidebar.emit("window-shown")

	def about_dialog(self, widget, data=None):# The About Dialog
		print ("DEBUG: opening about dialog @", (str(datetime.datetime.now())))
		about_dialog = Gtk.AboutDialog()
		if self.silaty.is_visible():
			about_dialog.set_transient_for(self.silaty)
		else:
			about_dialog.set_position(Gtk.WindowPosition.CENTER)
		logo = GdkPixbuf.Pixbuf.new_from_file(os.path.dirname(os.path.realpath(__file__)) + "/icons/hicolor/48x48/apps/silaty.svg")
		about_dialog.set_logo(logo)
		about_dialog.set_program_name(_("Silaty"))
		about_dialog.set_website("https://github.com/AXeL-dev/Silaty")
		about_dialog.set_website_label(_("GitHub Project Page"))
		about_dialog.set_authors(["AXeL-dev <contact.axel.dev@gmail.com> (Maintainer)", "Jesse Wayde Brandão <www.jwb@gmail.com> (Lead Developer)",\
		 "Mohamed Alaa <m.alaa8@gmail.com> (Developer)","Eslam Mostafa <CsEslam@gmail.com> (Developer)",\
		 "Ahmed Youssef <xmonader(at)gmail.com> (Developer)"])
		about_dialog.set_artists(["Mustapha Asbbar <abobakrsalafi@gmail.com> (Designer)"])
		about_dialog.set_license('''Silaty, A Prayer Times Reminder Application.
Copyright © 2019 Silaty Team

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/>.''')
		about_dialog.set_version("1.3")
		about_dialog.set_comments(_("A neat Prayer Time Reminder App.\n Simple and complete so no prayer is missed"))
		about_dialog.set_copyright(_("Copyright © %s Silaty Team") % '2019')
		about_dialog.run()
		about_dialog.destroy()

	def quit(self, widget):
		self.silaty.prayertimes.options.save_options()
		self.silaty.destroy()
		Gtk.main_quit()

	def main(self):
		Gtk.main()
		print ("DEBUG: starting/stopping GTK @", (str(datetime.datetime.now())))

if __name__ == '__main__':
	ipm = SilatyIndicator()
	ipm.main()