require 'RMagick'

module Alula
  module Plugins
    class GenericAsset < Liquid::Tag
      def self.type(type)
        define_method(:type) { type }
      end
      
      def self.default(default)
        define_method(:default) { default }
      end
      
      def initialize(tag_name, markup, tokens)
        super
        
        /(?<name>\w+)/ =~ markup
        @name = "#{name || default}.#{type}"
      end
      
      def render(context)
        asset_path = context.registers[:site].config["asset_path"]
        manifest = context.registers[:site].config["manifest"]
        
        content(File.join(asset_path, manifest.assets[@name]))
      end
    end
    
    class StylesheetAsset < GenericAsset
      type :css
      default :styles
      
      def content(asset)
        "<link rel=\"stylesheet\" href=\"#{asset}\" media=\"screen,projection\" type=\"text/css\">"
      end
    end

    class JavascriptAsset < GenericAsset
      type :js
      default "scripts"
      
      def content(asset)
        if File.size(File.join("public", asset)) < 10
          content = File.read(File.join("public", asset))
          unless content == ";"
            "<script type=\"text/javascript\">#{content}</script>"
          end
        else
          "<script type=\"text/javascript\" src=\"#{asset}\"></script>"
        end
      end
    end
    
    class ImageAsset < GenericAsset
      def initialize(tag_name, markup, tokens)
        /(?<src>(?:https?:\/\/|\/|\S+\/)\S+)(?<title>\s+.+)/ =~ markup
        /(?:"|')(?<title>[^"']+)?(?:"|')\s+(?:"|')(?<alt>[^"']+)?(?:"|')/ =~ title
        
        @name = src
        @title = title
        @alt = alt
      end

      def render(context)
        asset_path = context.registers[:site].config["asset_path"]
        manifest = context.registers[:site].config["manifest"]
        
        asset = File.join(asset_path, manifest.assets[@name])
        
        # Fetch image size
        img = Magick::Image.read(File.join("public", asset)).first
        width = img.columns
        height = img.rows
        
        "<img src=\"#{asset}\" alt=\"#{@alt}\" title=\"#{@title}\" width=\"#{width}\" height=\"#{height}\">"
      end
    end
  end
end


Liquid::Template.register_tag('stylesheet_link', Alula::Plugins::StylesheetAsset)
Liquid::Template.register_tag('javascript_link', Alula::Plugins::JavascriptAsset)
Liquid::Template.register_tag('image', Alula::Plugins::ImageAsset)