# frozen_string_literal: true

module JekyllImport
  module Importers
    class TextPattern < Importer
      # Reads a MySQL database via Sequel and creates a post file for each post.
      # The only posts selected are those with a status of 4 or 5, which means
      # "live" and "sticky" respectively.
      # Other statuses are 1 => draft, 2 => hidden and 3 => pending.
      QUERY = "SELECT Title, \
                      url_title, \
                      Posted, \
                      Body, \
                      Keywords \
               FROM textpattern \
               WHERE Status = '4' OR \
                     Status = '5'"

      def self.require_deps
        JekyllImport.require_with_fallback(%w(
          rubygems
          sequel
          mysql2
          fileutils
          safe_yaml
        ))
      end

      def self.specify_options(c)
        c.option "dbname",   "--dbname DB",   "Database name."
        c.option "user",     "--user USER",   "Database user name."
        c.option "password", "--password PW", "Database user's password. (default: '')"
        c.option "host",     "--host HOST",   "Database host name. (default: 'localhost')"
      end

      def self.process(options)
        dbname = options.fetch("dbname")
        user   = options.fetch("user")
        pass   = options.fetch("password", "")
        host   = options.fetch("host", "127.0.0.1")

        db = Sequel.mysql2(dbname, :user => user, :password => pass, :host => host, :encoding => "utf8")

        FileUtils.mkdir_p "_posts"

        db[QUERY].each do |post|
          # Get required fields and construct Jekyll compatible name.
          title = post[:Title]
          slug = post[:url_title]
          date = post[:Posted]
          content = post[:Body]

          name = [date.strftime("%Y-%m-%d"), slug].join("-") + ".textile"

          # Get the relevant fields as a hash, delete empty fields and convert
          # to YAML for the header.
          data = {
            "layout" => "post",
            "title"  => title.to_s,
            "tags"   => post[:Keywords].split(","),
          }.delete_if { |_k, v| v.nil? || v == "" }.to_yaml

          # Write out the data and content to file.
          File.open("_posts/#{name}", "w") do |f|
            f.puts data
            f.puts "---"
            f.puts content
          end
        end
      end
    end
  end
end
