require './app/commands/base_command.rb'

class ImageCommand < BaseCommand
  def self.opts
    {
      usage: {
        name: "Searches for your character, by name",
        keyword: "Searches for your character's image, by title or keyword," +
        " or specifies the title if new image. If an image exists for the" +
        " character with that name, the new flag and url will overwrite it",
        flag: "Delete indicates you want to delete the specified image." +
        " With a new image, SFW or NSFW should be used to specify image rating",
        url: "The url to the new image. This must be a direct link, so check" +
        " for a .jpg/.png or similar. Animated gifs are allowed",
      }
    }
  end

  def self.cmd
    desc = "View, add and edit your characters' images. " +
      "Usable only in a direct message with R0ry!"

    @cmd ||= Command.new(:image, desc, opts) do |event, name, keyword, tag, url, id|
      # Save the character creator's User, and find the character
      user = id ? User.find(id) : User.find(event.author.id)
      character = Character.where(user_id: user.id).find_by('name ilike ?', name)

      # Determine action, and execute
      if url
        # Error if any fields are invalid
        valid =
          keyword && url && tag&.match(/n?sfw/i)
        raise 'Invalid Parameters!' unless valid

        # Create and submit image application
        embed = CharImage.to_form(
          char: character,
          keyword: keyword,
          category: tag,
          url: url,
          user_id: user.id
        )

        [
          BotResponse.new(
            destination: ENV['APP_CH'].to_i,
            embed: embed,
            reactions: Emoji::REQUEST
          ),
          BotResponse.new(
            embed: success_embed("Your image has been sumbitted for approval!")
          )
        ]

      elsif tag&.match(/delete/i)
        # Find character's image and destroy it
        CharImage.where(char_id: character.id).
          find_by('keyword ilike ?', keyword).destroy
        success_embed("Removed image: #{keyword}")

      elsif keyword
        # Find image, and display
        image = CharImage.where(char_id: character.id).
          find_by('keyword ilike ?', keyword)
        character_embed(
          character: character,
          event: event,
          section: :image,
          image: image
        )

      # Show all character images
      else
        image_list_embed(character, event)
      end

    rescue ActiveRecord::RecordNotFound => e
      error_embed("Record not Found!", e.message)
    rescue StandardError => e
      error_embed(e.message)
    end
  end

  def self.example_command(event=nil)
    kws = ['Fluffy', 'Pupper', 'Midnight Drink', 'On the prowl', 'Bork']
    image_url = "https://i.imgur.com/Xa9WgSn.jpg"

    case ['name', 'keyword', 'delete', 'update', 'url'].sample
    when 'name'
      [Character.where.not(active: 'Deleted').order('RANDOM()').first.name]
    when 'keyword'
      img = CharImage.where.not(keyword: 'Default').order('RANDOM()').first
      [Character.find(img.char_id).name, img.keyword]
    when 'delete'
      img = CharImage.where.not(keyword: 'Default').order('RANDOM()').first
      [Character.find(img.char_id).name, img.keyword, 'delete']
    when 'update'
      img = CharImage.where.not(keyword: 'Default').order('RANDOM()').first
      [Character.find(img.char_id).name, img.keyword, 'sfw', image_url]
    when 'url'
      char = Character.where.not(active: 'Deleted').order('RANDOM()').first.name
      [char, kws.sample, 'sfw', image_url]
    end
  end

  def admin_opts
    {
      usage: {
        name: "Character's name",
        keyword: "Image Keyword",
        tag: "SFW/NSFW or Delete",
        url: "Image URL",
        id: "Character's user id"
      }
    }
  end

  def self.restricted_to
    :pm
  end
end
