# frozen_string_literal: true

module JekyllImport
  module Importers
    class Behance < Importer
      def self.require_deps
        JekyllImport.require_with_fallback(%w(
          fileutils
          safe_yaml
          date
          time
          behance
        ))
      end

      def self.specify_options(c)
        c.option "user",      "--user NAME",       "The username of the account"
        c.option "api_token", "--api_token TOKEN", "The API access token for the account"
      end

      def self.validate(options)
        %w(user api_token).each do |option|
          abort "Missing mandatory option --#{option}." if options[option].nil?
        end
      end

      # Process the import.
      #
      # user - the behance user to retrieve projects (ID or username)
      # api_token - your developer API Token
      #
      # Returns nothing.
      def self.process(options)
        user  = options.fetch("user")
        token = options.fetch("api_token")

        client = fetch_behance(token)

        user_projects = client.user_projects(user)

        Jekyll.logger.info "#{user_projects.length} project(s) found. Importing now..."

        user_projects.each do |project|
          details = client.project(project["id"])
          title   = project["name"].to_s
          formatted_date = Time.at(project["published_on"].to_i).to_date.to_s

          post_name = title.split(%r{ |!|/|:|&|-|$|,}).map do |character|
            character.downcase unless character.empty?
          end.compact.join("-")

          name = "#{formatted_date}-#{post_name}"

          header = {
            "layout"  => "post",
            "title"   => title,
            "details" => details,
          }

          FileUtils.mkdir_p("_posts")

          File.open("_posts/#{name}.md", "w") do |f|
            f.puts header.to_yaml
            f.puts "---\n\n"
            f.puts details["description"].to_s
          end
        end

        Jekyll.logger.info "Finished importing."
      end

      class << self
        private

        def fetch_behance(token)
          ::Behance::Client.new(:access_token => token)
        end
      end
    end
  end
end
