# frozen_string_literal: true

module Masks
  # @visibility private
  module Manage
    class ActorsController < BaseController
      section :actors

      before_action :find_actor

      def index
        @pagy, @actors = pagy(actor_model.all)
      end

      def create
        actor =
          signup_access.signup(
            nickname: params[:nickname],
            password: params[:password]
          )

        if actor.valid?
          redirect_to manage_actor_path(actor)
        else
          flash[:errors] = actor.errors.full_messages
          redirect_to manage_actors_path
        end
      end

      def update
        actor_model.transaction do
          if params[:add_scope]
            @actor.assign_scopes!(params[:add_scope])
            flash[:info] = "added scope \"#{params[:add_scope]}\""
          elsif params[:remove_scope]
            @actor.remove_scopes!(params[:remove_scope])
            flash[:info] = "removed scope \"#{params[:remove_scope]}\""
          elsif params[:remove_factor2]
            @actor.remove_factor2!
            flash[:info] = "removed second factor authentication"
          elsif params[:logout]
            @actor.logout!
            flash[:info] = "logged out of all devices"
          elsif password_param
            password_access.change_password(password_param, actor: @actor)

            if @actor.valid?
              flash[:info] = "password changed"
            else
              flash[:error] = "invalid password"
            end
          end

          redirect_to manage_actor_path(@actor)
        end

        @actor
      end

      private

      def find_actor
        @actor = actor_model.find_by(nickname: params[:actor])
      end

      def actor_model
        Masks.configuration.model(:actor)
      end

      def signup_access
        masked_session.access("actor.signup")
      end

      def password_access
        masked_session.access("actor.password")
      end

      def password_param
        params[:change_password]
      end
    end
  end
end