# frozen_string_literal: true
module DiscourseApi
  module API
    module Users
      def activate(id)
        put("/admin/users/#{id}/activate")
      end

      def user(username, params = {})
        response = get("/users/#{username}.json", params)
        response[:body]['user']
      end

      def user_sso(user_id)
        response = get("/admin/users/#{user_id}.json")
        response[:body]['single_sign_on_record']
      end

      def update_avatar(username, args)
        args = API.params(args)
          .optional(:file, :url)
          .default(type: 'avatar', synchronous: true)
          .to_h
        upload_response = post("/uploads", args)
        put("/u/#{username}/preferences/avatar/pick", upload_id: upload_response['id'])
      end

      def update_email(username, email)
        put("/u/#{username}/preferences/email", email: email)
      end

      def update_user(username, args)
        args = API.params(args)
          .optional(:name, :title, :bio_raw, :location, :website, :profile_background, :card_background,
                    :email_messages_level, :mailing_list_mode, :homepage_id, :theme_ids, :user_fields)
          .to_h
        put("/u/#{username}", args)
      end

      def update_username(username, new_username)
        put("/u/#{username}/preferences/username", new_username: new_username)
      end

      def update_trust_level(user_id, args)
        args = API.params(args)
          .required(:level)
          .to_h
        response = put("/admin/users/#{user_id}/trust_level", args)
        response[:body]
      end

      def create_user(args)
        args = API.params(args)
          .required(:name, :email, :password, :username)
          .optional(:active, :approved, :staged, :user_fields)
          .to_h
        post("/users", args)
      end

      def log_out(id)
        post("/admin/users/#{id}/log_out")
      end

      def invite_admin(args = {})
        post("/admin/users/invite_admin", args)
      end

      def list_users(type, params = {})
        response = get("admin/users/list/#{type}.json", params)
        response[:body]
      end

      def grant_admin(user_id)
        response = put("admin/users/#{user_id}/grant_admin")
        response[:body]
      end

      def revoke_admin(user_id)
        response = put("admin/users/#{user_id}/revoke_admin")
        response[:body]
      end

      def grant_moderation(user_id)
        response = put("admin/users/#{user_id}/grant_moderation")
        response[:body]
      end

      def revoke_moderation(user_id)
        put("admin/users/#{user_id}/revoke_moderation")
      end

      def by_external_id(external_id)
        response = get("/users/by-external/#{external_id}")
        response[:body]['user']
      end

      def suspend(user_id, suspend_until, reason)
        put("/admin/users/#{user_id}/suspend", suspend_until: suspend_until, reason: reason)
      end

      def unsuspend(user_id)
        put("/admin/users/#{user_id}/unsuspend")
      end

      def anonymize(user_id)
        put("/admin/users/#{user_id}/anonymize")
      end

      def delete_user(user_id, delete_posts = false)
        delete("/admin/users/#{user_id}.json?delete_posts=#{delete_posts}")
      end

      def check_username(username)
        response = get("/users/check_username.json?username=#{CGI.escape(username)}")
        response[:body]
      end

      def deactivate(user_id)
        put("/admin/users/#{user_id}/deactivate")
      end
    end
  end
end