# coding: utf-8
include REXML

class FeedsController < ApplicationController
  
  caches_action :publications, :publications_plain, :bestsellers, :bestsellers_plain, :promotions, :promotions_plain, :expires_in => 1.hour, :cache_path => lambda { |c| c.cache_key }, :if => Proc.new { |c| ('rss' == c.params[:format]) && c.params[:cc].blank? }

	def cache_key
		key = "#{params[:controller]}/#{params[:action]}"
		params.each_pair { |k, v| key += ":#{k}=#{v.gsub(/\s/, "_")}" }
		key
	end

  def publications
    
    expire_action :controller => 'feeds', :action => 'publications', :format => 'rss' unless params[:cc].blank?
    
    @channel  = {
                  'title'           => 'Złote Myśli - publikacje',
                  'description'     => 'Złote Myśli - Bliżej sukcesu',
                  'link'            => 'http://www.zlotemysli.pl/',
                  'language'        => 'pl',
                  'copyright'       => 'Złote Myśli Sp. z o.o.',
                  'category'        => 'Ebooks',
                  'lastBuildDate'   => Time.now,
                  'pubDate'         => Time.now,
                  'docs'            => 'http://cyber.law.harvard.edu/rss/rss.html',
                  'webMaster'       => 'admin@zlotemysli.pl',
                }

    respond_to do |format|
      format.html { render :text => '' }
      format.rss do
        
        require 'rexml/document'

        d       = Document.new('<?xml version="1.0" encoding="UTF-8"?>')
        rss     = d.add_element 'rss', { 'version' => '2.0' }
        channel = rss.add_element 'channel'
          
        @channel.each_pair do |tag, value|
          item_tag      = channel.add_element tag
          item_tag.text = value
        end
        
        Publication.find(:all, :select => 'publications.title, publications.id, publications.short, versions.pub_date', :conditions => ['(publications.visible % 2) = ? AND versions.version = ? AND versions.price > ?', 1, 0, 0], :include => :publication_versions, :order => 'versions.pub_date DESC', :limit => 15).each do |p|
          item = channel.add_element 'item'
          tags = {
                  'title'       => Iconv.iconv('utf-8', 'latin2', p.title).join,
                  'link'        => p.link(params[:zpplink]),
                  'guid'        => p.link(params[:zpplink]),
                  'description' => publication_html(p),
                  'category'    => 'Ebooks',
                  'pubDate'     => p.publication_versions.first.pub_date
                }

          tags.each_pair do |tag, value|
            item_tag      = item.add_element tag
            item_tag.text = value
          end
        end

        render :text => d, :content_type => Mime::XML
        
      end #format.rss do
    end #respond_to do |format|
  end #def publications
  
  def publications_plain
    
    expire_action :controller => 'feeds', :action => 'publications_plain', :format => 'rss' unless params[:cc].blank?
    
    @channel  = {
                  'title'           => 'Złote Myśli - publikacje',
                  'description'     => 'Złote Myśli - Bliżej sukcesu',
                  'link'            => 'http://www.zlotemysli.pl/',
                  'language'        => 'pl',
                  'copyright'       => 'Złote Myśli Sp. z o.o.',
                  'category'        => 'Ebooks',
                  'lastBuildDate'   => Time.now,
                  'pubDate'         => Time.now,
                  'docs'            => 'http://cyber.law.harvard.edu/rss/rss.html',
                  'webMaster'       => 'admin@zlotemysli.pl',
                }

    respond_to do |format|
      format.html { render :text => '' }
      format.rss do
        
        require 'rexml/document'

        d       = Document.new('<?xml version="1.0" encoding="UTF-8"?>')
        rss     = d.add_element 'rss', { 'version' => '2.0' }
        channel = rss.add_element 'channel'
          
        @channel.each_pair do |tag, value|
          item_tag      = channel.add_element tag
          item_tag.text = value
        end
        
        Publication.find(:all, :select => 'publications.title, publications.id, publications.short, versions.pub_date', :conditions => ['(publications.visible % 2) = ? AND versions.version = ? AND versions.price > ?', 1, 0, 0], :include => :publication_versions, :order => 'versions.pub_date DESC', :limit => 15).each do |p|
          item = channel.add_element 'item'
          tags = {
                  'title'               => Iconv.iconv('utf-8', 'latin2', p.title).join,
                  'link'                => p.link(params[:zpplink]),
                  'guid'                => p.link(params[:zpplink]),
                  'description'         => Iconv.iconv('utf-8', 'latin2', p.short).join,
                  'category'            => 'Ebooks',
                  'pubDate'             => p.publication_versions.first.pub_date,
                  'okladkamini'         => p.publication_image.source('mini'),
                  'okladkamidi'         => p.publication_image.source('middle'),
                  'linkdodajdokoszyka'  => p.cart_link(params[:zpplink]),
                  'najnizszacena'       => p.lowest_price
                }

          tags.each_pair do |tag, value|
            item_tag      = item.add_element tag
            item_tag.text = value
          end
        end

        render :text => d, :content_type => Mime::XML
        
      end #format.rss do
    end #respond_to do |format|
  end #def publications_plain
  
  def bestsellers
    
    expire_action :controller => 'feeds', :action => 'bestsellers', :format => 'rss' unless params[:cc].blank?
    
    @channel  = {
                  'title'           => 'Złote Myśli - Bestsellery',
                  'description'     => 'Złote Myśli - Bliżej sukcesu',
                  'link'            => 'http://www.zlotemysli.pl/',
                  'language'        => 'pl',
                  'copyright'       => 'Złote Myśli Sp. z o.o.',
                  'category'        => 'Ebooks',
                  'lastBuildDate'   => Time.now,
                  'pubDate'         => Time.now,
                  'docs'            => 'http://cyber.law.harvard.edu/rss/rss.html',
                  'webMaster'       => 'admin@zlotemysli.pl',
                }

    respond_to do |format|
      format.html { render :text => '' }
      format.rss do
        
        require 'rexml/document'

        d       = Document.new('<?xml version="1.0" encoding="UTF-8"?>')
        rss     = d.add_element 'rss', { 'version' => '2.0' }
        channel = rss.add_element 'channel'
          
        @channel.each_pair do |tag, value|
          item_tag      = channel.add_element tag
          item_tag.text = value
        end
        
        bestseller_ids  = []
        publications    = {}
        ActiveRecord::Base.connection.select_rows("SELECT v.publications_id AS pid, COUNT(1) AS c FROM ordered_versions ov, versions v WHERE ov.version_id = v.id AND ov.lastmodified > '#{4.weeks.ago}' AND v.price > 0 GROUP BY pid ORDER BY c DESC LIMIT 15").map{ |pid, count| bestseller_ids << pid.to_i }
        Publication.find(:all, :select => 'publications.title, publications.id, publications.short, versions.pub_date', :conditions => ['publications.id IN (?) AND (publications.visible % 2) = ? AND versions.price > ? AND publications.category_id != ?', bestseller_ids, 1, 0, 2149], :include => :publication_versions).map{ |p| publications[p.id] = p }

        bestseller_ids.each_with_index do |v, idx|
          p     = publications[v]

          next if p.blank?
          
          item  = channel.add_element 'item'
          tags  = {
                  'title'       => Iconv.iconv('utf-8', 'latin2', p.title).join,
                  'link'        => p.link(params[:zpplink]),
                  'guid'        => p.link(params[:zpplink]),
                  'description' => publication_html(p),
                  'category'    => 'Ebooks',
                  'pubDate'     => Time.now - idx
                }

          tags.each_pair do |tag, value|
            item_tag      = item.add_element tag
            item_tag.text = value
          end
        end

        render :text => d, :content_type => Mime::XML
        
      end #format.rss do
    end #respond_to do |format|
  end #def bestsellers
  
  def bestsellers_plain
    
    expire_action :controller => 'feeds', :action => 'bestsellers_plain', :format => 'rss' unless params[:cc].blank?
    
    @channel  = {
                  'title'           => 'Złote Myśli - Bestsellery',
                  'description'     => 'Złote Myśli - Bliżej sukcesu',
                  'link'            => 'http://www.zlotemysli.pl/',
                  'language'        => 'pl',
                  'copyright'       => 'Złote Myśli Sp. z o.o.',
                  'category'        => 'Ebooks',
                  'lastBuildDate'   => Time.now,
                  'pubDate'         => Time.now,
                  'docs'            => 'http://cyber.law.harvard.edu/rss/rss.html',
                  'webMaster'       => 'admin@zlotemysli.pl',
                }

    respond_to do |format|
      format.html { render :text => '' }
      format.rss do
        
        require 'rexml/document'

        d       = Document.new('<?xml version="1.0" encoding="UTF-8"?>')
        rss     = d.add_element 'rss', { 'version' => '2.0' }
        channel = rss.add_element 'channel'
          
        @channel.each_pair do |tag, value|
          item_tag      = channel.add_element tag
          item_tag.text = value
        end
        
        bestseller_ids  = []
        publications    = {}
        ActiveRecord::Base.connection.select_rows("SELECT v.publications_id AS pid, COUNT(1) AS c FROM ordered_versions ov, versions v WHERE ov.version_id = v.id AND ov.lastmodified > '#{4.weeks.ago}' AND v.price > 0 GROUP BY pid ORDER BY c DESC LIMIT 15").map{ |pid, count| bestseller_ids << pid.to_i }
        Publication.find(:all, :select => 'publications.title, publications.id, publications.short, versions.pub_date', :conditions => ['publications.id IN (?) AND (publications.visible % 2) = ? AND versions.price > ? AND publications.category_id != ?', bestseller_ids, 1, 0, 2149], :include => :publication_versions).map{ |p| publications[p.id] = p }

        bestseller_ids.each_with_index do |v, idx|
          p     = publications[v]

          next if p.blank?

          item = channel.add_element 'item'
          tags = {
                  'title'               => Iconv.iconv('utf-8', 'latin2', p.title).join,
                  'link'                => p.link(params[:zpplink]),
                  'guid'                => p.link(params[:zpplink]),
                  'description'         => Iconv.iconv('utf-8', 'latin2', p.short).join,
                  'category'            => 'Ebooks',
                  'pubDate'             => Time.now - idx,
                  'okladkamini'         => p.publication_image.source('mini'),
                  'okladkamidi'         => p.publication_image.source('middle'),
                  'linkdodajdokoszyka'  => p.cart_link(params[:zpplink]),
                  'najnizszacena'       => p.lowest_price
                }

          tags.each_pair do |tag, value|
            item_tag      = item.add_element tag
            item_tag.text = value
          end
        end

        render :text => d, :content_type => Mime::XML
        
      end #format.rss do
    end #respond_to do |format|
  end #def bestsellers_plain

  def promotions
    
    expire_action :controller => 'feeds', :action => 'promotions', :format => 'rss' unless params[:cc].blank?
    
    @channel  = {
                  'title'           => 'Złote Myśli - Promocje',
                  'description'     => 'Złote Myśli - Bliżej sukcesu',
                  'link'            => 'http://www.zlotemysli.pl/',
                  'language'        => 'pl',
                  'copyright'       => 'Złote Myśli Sp. z o.o.',
                  'category'        => 'Ebooks',
                  'lastBuildDate'   => Time.now,
                  'pubDate'         => Time.now,
                  'docs'            => 'http://cyber.law.harvard.edu/rss/rss.html',
                  'webMaster'       => 'admin@zlotemysli.pl',
                }

    respond_to do |format|
      format.html { render :text => '' }
      format.rss do
        
        require 'rexml/document'

        d       = Document.new('<?xml version="1.0" encoding="UTF-8"?>')
        rss     = d.add_element 'rss', { 'version' => '2.0' }
        channel = rss.add_element 'channel'
          
        @channel.each_pair do |tag, value|
          item_tag      = channel.add_element tag
          item_tag.text = value
        end
        
        Publication.find(:all, :select => 'publications.title, publications.id, publications.short, versions.date_start', :conditions => ['(publications.visible % 2) = ? AND (versions.cena_promocyjna IS NOT NULL OR versions.uciekajaca_cena_pocz IS NOT NULL) AND versions.date_start <= ? AND versions.date_end >= ?', 1, Time.now, Time.now], :include => :publication_versions).each do |p|
          item  = channel.add_element 'item'
          tags  = {
                  'title'       => Iconv.iconv('utf-8', 'latin2', p.title).join,
                  'link'        => p.link(params[:zpplink]),
                  'guid'        => p.link(params[:zpplink]),
                  'description' => publication_html(p),
                  'category'    => 'Ebooks',
                  'pubDate'     => Time.now + p.lowest_price.to_i
                }

          tags.each_pair do |tag, value|
            item_tag      = item.add_element tag
            item_tag.text = value
          end
        end

        render :text => d, :content_type => Mime::XML
        
      end #format.rss do
    end #respond_to do |format|
  end #def promotions

  def promotions_plain
    
    expire_action :controller => 'feeds', :action => 'promotions_plain', :format => 'rss' unless params[:cc].blank?
    
    @channel  = {
                  'title'           => 'Złote Myśli - Promocje',
                  'description'     => 'Złote Myśli - Bliżej sukcesu',
                  'link'            => 'http://www.zlotemysli.pl/',
                  'language'        => 'pl',
                  'copyright'       => 'Złote Myśli Sp. z o.o.',
                  'category'        => 'Ebooks',
                  'lastBuildDate'   => Time.now,
                  'pubDate'         => Time.now,
                  'docs'            => 'http://cyber.law.harvard.edu/rss/rss.html',
                  'webMaster'       => 'admin@zlotemysli.pl',
                }

    respond_to do |format|
      format.html { render :text => '' }
      format.rss do
        
        require 'rexml/document'

        d       = Document.new('<?xml version="1.0" encoding="UTF-8"?>')
        rss     = d.add_element 'rss', { 'version' => '2.0' }
        channel = rss.add_element 'channel'
          
        @channel.each_pair do |tag, value|
          item_tag      = channel.add_element tag
          item_tag.text = value
        end
        
        Publication.find(:all, :select => 'publications.title, publications.id, publications.short, versions.date_start', :conditions => ['(publications.visible % 2) = ? AND (versions.cena_promocyjna IS NOT NULL OR versions.uciekajaca_cena_pocz IS NOT NULL) AND versions.date_start <= ? AND versions.date_end >= ?', 1, Time.now, Time.now], :include => :publication_versions).each do |p|
          item = channel.add_element 'item'
          tags = {
                  'title'               => Iconv.iconv('utf-8', 'latin2', p.title).join,
                  'link'                => p.link(params[:zpplink]),
                  'guid'                => p.link(params[:zpplink]),
                  'description'         => Iconv.iconv('utf-8', 'latin2', p.short).join,
                  'category'            => 'Ebooks',
                  'pubDate'             => Time.now + p.lowest_price.to_i,
                  'okladkamini'         => p.publication_image.source('mini'),
                  'okladkamidi'         => p.publication_image.source('middle'),
                  'linkdodajdokoszyka'  => p.cart_link(params[:zpplink]),
                  'najnizszacena'       => p.lowest_price
                }

          tags.each_pair do |tag, value|
            item_tag      = item.add_element tag
            item_tag.text = value
          end
        end

        render :text => d, :content_type => Mime::XML
        
      end #format.rss do
    end #respond_to do |format|
  end #def promotions_plain
  
  private
    def publication_html(p)
      return <<-EOF
        <div>
          <p>#{Iconv.iconv('utf-8', 'latin2', p.short).join}</p>
          <img src='#{p.publication_image.source('middle')}' />
          <a href='#{p.link(params[:zpplink])}'>zobacz więcej &raquo;</a>
        </div>
      EOF
    end
  
end
