require 'bugsnag'
class ApplicationController < ActionController::Base
  #protect_from_forgery #XXX turn back on; but client needs to send X-CRSF-TOKEN intsead of COOKIE
  include ApplicationHelper
  include SessionsHelper
  include ClientHelper

  force_ssl port: Rails.application.config.external_port_ssl if Rails.application.config.force_ssl

  # inject username/email into bugsnag data
  before_bugsnag_notify :add_user_info_to_bugsnag

  before_filter do
    gon_setup
  end

  before_filter :set_tracking_cookie
  before_filter :track_affiliate_visits
  before_filter :track_origin

  #before_filter do
  #  if params[AffiliatePartner::PARAM_REFERRAL].present? && current_user.nil?
  #    if cookies[AffiliatePartner::PARAM_COOKIE].blank?
  #      code = params[AffiliatePartner::PARAM_REFERRAL].downcase
  #      cookies[AffiliatePartner::PARAM_COOKIE] = code if AffiliatePartner.is_code?(code)
  #    end
  #  end
  #end

  def affiliate_code
    #cookies[AffiliatePartner::PARAM_COOKIE]
  end


  # http://stackoverflow.com/questions/15807214/where-to-set-a-tracking-permanent-cookie-in-rails
  def set_tracking_cookie
    cookies.permanent[:user_uuid] = SecureRandom.uuid unless cookies[:user_uuid]
  end

  def track_affiliate_visits
    if params[:affiliate]
      visit_cookie = cookies[:affiliate_visitor]
      AffiliateReferralVisit.track(affiliate_id: params[:affiliate], visited: visit_cookie, remote_ip: request.remote_ip, visited_url: request.fullpath, referral_url: request.referer, current_user: current_user)

      # set a cookie  with the ID of the partner, and expires in 24 hours
      cookies[:affiliate_visitor] = { :value => params[:affiliate], :expires => Time.now + 3600 * 24} # 1 day from now
    end
  end

  def origin_cookie
    begin
      JSON.parse(cookies[:origin]) if cookies[:origin]
    rescue
      nil
    end

  end

  def track_origin
    return if current_user

    origin = cookies[:origin]

    # if this is a 1st visit, or if we previously said this was a direct link, then we'll refresh the info
    should_set = params[:utm_source] || origin.nil?
    if should_set
      if params[:utm_source]
        cookies.permanent[:origin] = {utm_source: params[:utm_source], utm_medium: params[:utm_medium], utm_campaign: params[:utm_campaign], referrer: request.referrer }.to_json

      elsif request.referer

        begin
          cookies.permanent[:origin] = {utm_source: "organic", utm_medium: "organic", utm_campaign: URI.parse(request.referer).host, referrer: request.referer}.to_json
        rescue

        end
      end
    end
  end


  private
  def add_user_info_to_bugsnag(notif)
    # Add some app-specific data which will be displayed on a custom
    # "User Info" tab on each error page on bugsnag.com

    unless current_user.nil?
      notif.add_tab(:user_info, {
          name: current_user.name,
          email: current_user.email
      })
    end
  end
end

class ControllerHelp
  include Singleton
  include ActionView::Helpers::TextHelper
  include ActionView::Helpers::UrlHelper
  include ActionView::Helpers::SanitizeHelper
  extend ActionView::Helpers::SanitizeHelper::ClassMethods
  include ActionView::Helpers::JavaScriptHelper
  include ActionView::Helpers::TagHelper
  include ActionView::Helpers::AssetTagHelper
end
