class LoginController < ApplicationController
  skip_before_action :authenticate # no authentication since this is the login page
  before_action :validate_token, only: %i[new_password update_password]

  # Display the form to enter an email address requesting a token to set a new password.
  def forgot_password
    @user = User.new
  end

  # Sends an email to a user with the token that allows setting a new password through action "password".
  def reset_password
    redirect_to forgot_password_url, alert: I18n.t('errors.general_again') and return if request.get? || params[:user].nil? # Catch for get request and give better error message.

    if (user = User.undeleted.find_by_email(params[:user][:email]))
      user.request_password_reset!
    end
    redirect_to login_url, notice: I18n.t('login.controller.reset_password.notice')
  end

  # Set a new password with a token from the password reminder email.
  # Called with params :id => User.id and :token => User.reset_password_token to specify a new password.
  def new_password; end

  # Sets a new password.
  # Called with params :id => User.id and :token => User.reset_password_token to specify a new password.
  def update_password
    @user.attributes = params[:user]
    if @user.valid?
      @user.reset_password_token = nil
      @user.reset_password_expires = nil
      @user.save
      redirect_to login_url, notice: I18n.t('login.controller.update_password.notice')
    else
      render :new_password
    end
  end

  # For invited users.
  def accept_invitation
    @invite = Invite.find_by_token(params[:token])
    if @invite.nil? || @invite.expires_at < Time.now
      redirect_to login_url, alert: I18n.t('login.controller.error_invite_invalid')
    elsif @invite.group.nil?
      redirect_to login_url, alert: I18n.t('login.controller.error_group_invalid')
    elsif request.post?
      User.transaction do
        @user = User.new(params[:user])
        @user.email = @invite.email
        if @user.save
          Membership.new(user: @user, group: @invite.group).save!
          @invite.destroy
          session[:locale] = @user.locale
          redirect_to login_url, notice: I18n.t('login.controller.accept_invitation.notice')
        end
      end
    else
      @user = User.new(email: @invite.email)
    end
  end

  protected

  def validate_token
    @user = User.find_by_id_and_reset_password_token(params[:id], params[:token])
    return unless @user.nil? || @user.reset_password_expires < Time.now

    redirect_to forgot_password_url, alert: I18n.t('login.controller.error_token_invalid')
  end
end
