# frozen_string_literal: true

class ApplicationController < ActionController::Base
  protect_from_forgery
  # Working from codespaces, we want to turn off validation
  skip_before_action :verify_authenticity_token if Rails.env.development? && ENV['CODESPACE_NAME']

  include ApplicationHelper

  after_action :store_location
  before_action :set_locale
  rescue_from ActiveRecord::RecordNotFound, with: :not_found

  def store_location
    unless request.path.in?(["/members/sign_in",
                             "/members/sign_up",
                             "/members/password/new",
                             "/members/password/edit",
                             "/members/confirmation",
                             "/members/sign_out"]) || request.xhr?
      store_location_for(:member, request.fullpath) if request.format == :html
    end
  end

  def not_found
    render file: 'app/views/errors/404.html', status: :not_found, layout: false
  end

  def after_sign_in_path_for(_resource)
    stored_location_for(:member) || root_path
  end

  def after_sign_out_path_for(_resource_or_scope)
    request.referer
  end

  # tweak CanCan defaults because we don't have a "current_user" method
  # this means that we use current_user in specs but current_member everywhere
  # else in the code.
  def current_ability
    @current_ability ||= Ability.new(current_member)
  end

  # CanCan error handling
  rescue_from CanCan::AccessDenied do |exception|
    redirect_to request.referer || root_url, alert: exception.message
  end

  def set_locale
    I18n.locale = params[:locale] || extract_locale_from_subdomain || I18n.default_locale
  end

  def extract_locale_from_subdomain
    parsed_locale = request.subdomains.first
    I18n.available_locales.map(&:to_s).include?(parsed_locale) ? parsed_locale : nil
  end

  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up) do |member|
      member.permit(:login_name, :email, :password, :password_confirmation,
                    :remember_me, :login,
                    # terms of service
                    :tos_agreement,
                    # profile stuff
                    :bio, :location, :latitude, :longitude,
                    # email settings
                    :show_email, :newsletter, :send_notification_email, :send_planting_reminder)
    end

    devise_parameter_sanitizer.permit(:account_update) do |member|
      member.permit(:login_name, :email, :password, :password_confirmation,
                    :remember_me, :login,
                    # terms of service
                    :tos_agreement,
                    # profile stuff
                    :bio, :location, :latitude, :longitude,
                    :website_url, :instagram_handle, :facebook_handle, :bluesky_handle, :other_url,
                    # email settings
                    :show_email, :newsletter, :send_notification_email, :send_planting_reminder,
                    # update password
                    :current_password)
    end
  end

  def expire_homepage
    expire_fragment("homepage_stats")
  end
end
