module ClientApi
  module Users
    class UsersController < ApplicationController
      def sign_out_user
        respond_to do |format|
          if sign_out current_user
            format.json { render json: {}, status: :ok }
          else
            format.json { render json: {}, status: :unauthorized }
          end
        end
      end

      def preferences_info
        respond_to do |format|
          format.json do
            render template: 'client_api/users/preferences',
                   status: :ok,
                   locals: { user: current_user }
          end
        end
      end

      def profile_info
        respond_to do |format|
          format.json do
            render template: '/client_api/users/profile',
                   status: :ok,
                   locals: { user: current_user }
          end
        end
      end

      def statistics_info
        respond_to do |format|
          format.json do
            render template: '/client_api/users/statistics',
                   status: :ok,
                   locals: { user: current_user }
          end
        end
      end

      def current_user_info
        respond_to do |format|
          format.json do
            render template: '/client_api/users/show',
                   status: :ok,
                   locals: { user: current_user }
          end
        end
      end

      def update
        service = ClientApi::Users::UpdateService.new(
          current_user: current_user,
          params: user_params
        )
        result = service.execute

        if result[:status] == :success
          bypass_sign_in(current_user)
          success_response
        else
          error_response(
            message: result[:message],
            details: service.user.errors
          )
        end
      end

      private

      def user_params
        params.require(:user)
              .permit(:password, :initials, :email, :full_name,
                      :password_confirmation, :current_password, :avatar,
                      :time_zone, :assignments_notification,
                      :assignments_email_notification, :recent_notification,
                      :recent_email_notification,
                      :system_message_email_notification,
                      :popovers_enabled)
      end

      def success_response(args = {})
        template = args.fetch(:template) { nil }
        locals = args.fetch(:locals) { {} }
        details = args.fetch(:details) { {} }

        respond_to do |format|
          format.json do
            if template
              render template: template,
                     status: :ok,
                     locals: locals
            else
              render json: { details: details }, status: :ok
            end
          end
        end
      end

      def error_response(args = {})
        message = args.fetch(:message) { t('client_api.generic_error_message') }
        details = args.fetch(:details) { {} }
        status = args.fetch(:status) { :unprocessable_entity }

        respond_to do |format|
          format.json do
            render json: {
              message: message,
              details: details
            },
            status: status
          end
        end
      end
    end
  end
end