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
          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"
        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', "localhost")

        db = Sequel.mysql(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