module Hourglass
  module ApplicationHelper
    def hourglass_asset_paths(type, sources)
      options = sources.extract_options!
      if options[:plugin] == Hourglass::PLUGIN_NAME && Rails.env.production?
        plugin = options.delete(:plugin)
        sources.map! do |source|
          extname = compute_asset_extname source, options.merge(type: type)
          source = "#{source}#{extname}" if extname.present?
          source = File.join Hourglass::Assets.asset_directory_map[type], source
          "/plugin_assets/#{plugin}/#{Hourglass::Assets.manifest.assets[source] || source}"
        end
      end
      sources.push options
    end

    def javascript_include_tag(*sources)
      super(*hourglass_asset_paths(:javascript, sources))
    end

    def stylesheet_link_tag(*sources)
      super(*hourglass_asset_paths(:stylesheet, sources))
    end

    def form_field(field, form, object, options = {})
      render partial: "hourglass_ui/forms/fields/#{field}", locals: {form: form, entry: object}.merge(options)
    end

    def issue_label_for(issue)
      "##{issue.id} #{issue.subject}" if issue
    end

    def projects_for_project_select(selected = nil)
      projects = User.current.projects.allowed_to_one_of(*(Hourglass::AccessControl.permissions_from_action(controller: 'hourglass/time_logs', action: 'book') + Hourglass::AccessControl.permissions_from_action(controller: 'hourglass/time_bookings', action: 'change')).flatten)
      project_tree_options_for_select projects, selected: selected do |project|
        {data: {
            round_default: Hourglass::SettingsStorage[:round_default, project: project],
            round_sums_only: Hourglass::SettingsStorage[:round_sums_only, project: project]
        }}
      end
    end

    def user_collection(project = nil)
      project.present? ? project.users : User.active
    end

    def localized_hours_in_units(hours)
      h, min = Hourglass::DateTimeCalculations.hours_in_units hours || 0
      "#{h}#{t('hourglass.ui.chart.hour_sign')} #{min}#{t('hourglass.ui.chart.minute_sign')}"
    end

    def in_user_time_zone(time)
      zone = User.current.time_zone
      if zone
        time.in_time_zone zone
      else
        time.utc? ? time.localtime : time
      end
    end

    def css_classes(*args)
      args.compact.join(' ')
    end

    def format_identifier_to_js(format)
      {
          '%b' => 'MMM',
          '%B' => 'MMMM',
          '%d' => 'DD',
          '%m' => 'MM',
          '%M' => 'mm',
          '%H' => 'HH',
          '%I' => 'hh',
          '%p' => 'A',
          '%P' => 'a',
          '%Y' => 'YYYY'
      }.inject(format) { |str, (k, v)| str.gsub(k, v) }
    end
  end
end
