require 'digest'
require 'vkontakte'

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_locale
  
  def cache_for time
    response.headers['Cache-Control'] = 'public, max-age=' + time.seconds.to_s
  end
  
  def compile_page params
    compiler = lambda do |params|
      @data = params[:data].is_a?(Proc) ? params[:data].call : params[:data].serialize unless params[:data].nil?
      @status = params[:status]
      {
        renderer: "unified",
        data: @data,
        html: render_compact_partial(params[:partial]),
        title: params[:title],
        status: (params[:status] unless params[:status].nil?),
        callback: (params[:callback] unless params[:callback].nil?)
      }.to_json.to_s
    end
    
    unless params[:cache_for].nil?
      data = Rails.cache.fetch(params[:cache_key] || cache_key_for(params[:data]), expires_in: params[:cache_for]) do
        compiler.call(params)
      end
    else
      data = compiler.call(params)
    end
    
    render text: data, content_type: 'application/json'
  end
  
  def get_artist_name_from_query
    params[:artist].gsub('%20', ' ').gsub('+', ' ').gsub('.html', '')
  end
  
protected

  def cache_key_for object
    "#{object.class.to_s.underscore}_#{object.id}"
  end
  
  def authorize
    unless Vkontakte.check(params)
      render json: { status: 'login failed' }, status: 403
    end
  end
  
  def set_locale
    session = Session.find_by_key(session_key)
    unless session.nil?
      I18n.locale = session.user.lang
    end
  end
  
  def session_key
    if cookies[:beathaven_sid].nil?
      cookies[:beathaven_sid] = {
        :value => Session.generate_key,
        :expire => 42.years.from_now.utc
      }
    end
    cookies[:beathaven_sid]
  end
  
  def render_compact_partial partial_name
    (render_to_string :partial => partial_name.to_s).gsub(/\n(\s+)?/, '')
  end
end