module ClockIndicator
  class Clock
    def initialize
      set_ui
      setup_callbacks
      start_update_thread
    end

    private

      def set_ui
        tray_icon.show_all
        gtk_update_ui
      end

      def tray_icon
        @tray_icon ||= Gtkti::TrayIcon.new("ClockIndicator::Clock").tap do |ti|
          ti.add(event_box)
          ti.tooltip_text = tooltip_status
        end
      end

      def event_box
        @event_box ||= Gtk::EventBox.new.tap do |eb|
          eb.add(tray_label)
        end
      end

      def tooltip_status
        Time.new.to_s
      end

      def time_item_text
        Time.new.strftime("%A, %B %e, %Y %I:%M:%S %P".freeze)
      end

      def sub_menu
        @sub_menu ||= SubMenu.new
      end

      def setup_callbacks
        GObject.signal_connect(event_box, "button-press-event") do |_, event, _|
          case event.button
          when 1
            toggle_calendar
          when 3
            popup_sub_menu(event)
          end
        end
      end

      def pos(event)
        proc { [event.x_root, 19] }
      end

      def toggle_calendar
        if @calendar_window.nil?
          calendar_window.show_all
        else
          calendar_window.destroy
          @calendar_window = nil
        end
      end

      def popup_sub_menu(event)
        gtk_update_ui
        sub_menu.popup(nil, nil, event.button, event.time)
      end

      def calendar_window
        @calendar_window ||= CalendarWindow.new
      end

      def tray_label
        @tray_label ||= Gtk::Label.new("")
      end

      def font
        Pango::FontDescription.from_string("Terminus 10")
      end

      def time
        Time.new.strftime(time_format)
      end

      def time_format
        "%a %m/%d/%Y <b>%I:%M%P</b> ".freeze
      end

      def start_update_thread
        Thread.new do
          check_interval_sec = 5
          loop do
            update_ui
            sleep(check_interval_sec)
          end
        end
      end

      def update_ui
        run_in_gtk = proc { gtk_update_ui }
        GLib.idle_add(GLib::PRIORITY_DEFAULT_IDLE, run_in_gtk, nil, nil)
      end

      def gtk_update_ui
        tray_label.markup = time
        tray_label.override_font(font)
        tray_icon.tooltip_text = tooltip_status
        sub_menu.time = time_item_text
      end

  end
end
