# frozen_string_literal: true

#
# Copyright (C) 2013 - present Instructure, Inc.
#
# This file is part of Canvas.
#
# Canvas is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, version 3 of the License.
#
# Canvas 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 Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.

module Canvas
  module LockExplanation
    include TextHelper

    def lock_explanation(hash, type, context = nil, options = {})
      include_js = options.fetch(:include_js, true)
      url_options = options.key?(:only_path) ? { only_path: options[:only_path] } : {}
      # Any additions to this function should also be made in javascripts/lock_reason.js
      if hash[:lock_at]
        case type
        when "quiz"
          I18n.t("messages.quiz_locked_at", "This quiz was locked %{at}.", at: datetime_string(hash[:lock_at]))
        when "assignment"
          I18n.t("messages.assignment_locked_at", "This assignment was locked %{at}.", at: datetime_string(hash[:lock_at]))
        when "topic"
          I18n.t("messages.topic_locked_at", "This topic was locked %{at}.", at: datetime_string(hash[:lock_at]))
        when "file"
          I18n.t("messages.file_locked_at", "This file was locked %{at}.", at: datetime_string(hash[:lock_at]))
        when "page"
          I18n.t("messages.page_locked_at", "This page was locked %{at}.", at: datetime_string(hash[:lock_at]))
        else
          I18n.t("messages.content_locked_at", "This content was locked %{at}.", at: datetime_string(hash[:lock_at]))
        end
      elsif hash[:unlock_at]
        case type
        when "quiz"
          I18n.t("messages.quiz_locked_until", "This quiz is locked until %{date}.", date: datetime_string(hash[:unlock_at]))
        when "assignment"
          I18n.t("messages.assignment_locked_until", "This assignment is locked until %{date}.", date: datetime_string(hash[:unlock_at]))
        when "topic"
          I18n.t("messages.topic_locked_until", "This topic is locked until %{date}.", date: datetime_string(hash[:unlock_at]))
        when "file"
          I18n.t("messages.file_locked_until", "This file is locked until %{date}.", date: datetime_string(hash[:unlock_at]))
        when "page"
          I18n.t("messages.page_locked_until", "This page is locked until %{date}.", date: datetime_string(hash[:unlock_at]))
        else
          I18n.t("messages.content_locked_until", "This content is locked until %{date}.", date: datetime_string(hash[:unlock_at]))
        end
      elsif hash[:context_module]
        obj = hash[:context_module].is_a?(ContextModule) ? hash[:context_module] : ContextModule.new(hash[:context_module])
        html = if obj.workflow_state == "unpublished"
                 case type
                 when "quiz"
                   I18n.t("messages.quiz_unpublished_module", "This quiz is part of an unpublished module and is not available yet.")
                 when "assignment"
                   I18n.t("messages.assignment_unpublished_module", "This assignment is part of an unpublished module and is not available yet.")
                 when "topic"
                   I18n.t("messages.topic_unpublished_module", "This topic is part of an unpublished module and is not available yet.")
                 when "file"
                   I18n.t("messages.file_unpublished_module", "This file is part of an unpublished module and is not available yet.")
                 when "page"
                   I18n.t("messages.page_unpublished_module", "This page is part of an unpublished module and is not available yet.")
                 else
                   I18n.t("messages.content_unpublished_module", "This content is part of an unpublished module and is not available yet.")
                 end
               elsif hash[:context_module]["unlock_at"] && hash[:context_module]["unlock_at"] > Time.zone.now
                 unlock_time = datetime_string(hash[:context_module]["unlock_at"])
                 case type
                 when "quiz"
                   I18n.t("messages.quiz_module_time_locked",
                          "This quiz is part of the module *%{module}*, which is locked until %{time}.",
                          module: obj.name,
                          time: unlock_time,
                          wrapper: '<b>\1</b>')
                 when "assignment"
                   I18n.t("messages.assignment_module_time_locked",
                          "This assignment is part of the module *%{module}*, which is locked until %{time}.",
                          module: obj.name,
                          time: unlock_time,
                          wrapper: '<b>\1</b>')
                 when "topic"
                   I18n.t("messages.topic_module_time_locked",
                          "This topic is part of the module *%{module}*, which is locked until %{time}.",
                          module: obj.name,
                          time: unlock_time,
                          wrapper: '<b>\1</b>')
                 when "file"
                   I18n.t("messages.file_module_time_locked",
                          "This file is part of the module *%{module}*, which is locked until %{time}.",
                          module: obj.name,
                          time: unlock_time,
                          wrapper: '<b>\1</b>')
                 when "page"
                   I18n.t("messages.page_module_time_locked",
                          "This page is part of the module *%{module}*, which is locked until %{time}.",
                          module: obj.name,
                          time: unlock_time,
                          wrapper: '<b>\1</b>')
                 else
                   I18n.t("messages.content_module_time_locked",
                          "This content is part of the module *%{module}*, which is locked until %{time}.",
                          module: obj.name,
                          time: unlock_time,
                          wrapper: '<b>\1</b>')
                 end
               else
                 case type
                 when "quiz"
                   I18n.t("messages.quiz_locked_module",
                          "This quiz is part of the module *%{module}* and hasn't been unlocked yet.",
                          module: obj.name,
                          wrapper: '<b>\1</b>')
                 when "assignment"
                   I18n.t("messages.assignment_locked_module",
                          "This assignment is part of the module *%{module}* and hasn't been unlocked yet.",
                          module: obj.name,
                          wrapper: '<b>\1</b>')
                 when "topic"
                   I18n.t("messages.topic_locked_module",
                          "This topic is part of the module *%{module}* and hasn't been unlocked yet.",
                          module: obj.name,
                          wrapper: '<b>\1</b>')
                 when "file"
                   I18n.t("messages.file_locked_module",
                          "This file is part of the module *%{module}* and hasn't been unlocked yet.",
                          module: obj.name,
                          wrapper: '<b>\1</b>')
                 when "page"
                   I18n.t("messages.page_locked_module",
                          "This page is part of the module *%{module}* and hasn't been unlocked yet.",
                          module: obj.name,
                          wrapper: '<b>\1</b>')
                 else
                   I18n.t("messages.content_locked_module",
                          "This content is part of the module *%{module}* and hasn't been unlocked yet.",
                          module: obj.name,
                          wrapper: '<b>\1</b>')
                 end
               end
        if context && (obj.workflow_state != "unpublished")

          context = context.context if context.is_a? Group
          raise "Either Context or Group context must be a Course" unless context.is_a? Course

          html << "<br/>".html_safe
          html << "<div class='spinner'></div>".html_safe
          html << I18n.t("messages.visit_modules_page",
                         "*Visit the course modules page for information on how to unlock this content.*",
                         wrapper: "<a #{"style='display: none;'" if include_js} class='module_prerequisites_fallback' href='#{course_context_modules_url(context || obj.context, anchor: "module_#{obj.id}", **url_options)}'>\\1</a>")
          html << "<a x-canvaslms-trusted-url='#{course_context_module_prerequisites_needing_finishing_path((context || obj.context).id, obj.id, hash[:asset_string])}' style='display: none;' id='module_prerequisites_lookup_link'>&nbsp;</a>".html_safe
          js_bundle :prerequisites_lookup if include_js
        end
        html
      else
        case type
        when "quiz"
          I18n.t("messages.quiz_locked", "This quiz is currently locked.")
        when "assignment"
          I18n.t("messages.assignment_locked", "This assignment is currently locked.")
        when "topic"
          I18n.t("This topic is closed for comments.")
        when "file"
          I18n.t("messages.file_locked", "This file is currently locked.")
        when "page"
          I18n.t("messages.page_locked", "This page is currently locked.")
        else
          I18n.t("messages.content_locked", "This quiz is currently locked.")
        end
      end
    end
  end
end
