module Gitrob
  class WebApp < Sinatra::Base
    set :logging, false
    set :sessions, false
    set :app_file, __FILE__
    set :root, File.expand_path("#{File.dirname(__FILE__)}/../../")
    set :public_folder, Proc.new { File.join(root, "public") }
    set :views, Proc.new { File.join(root, "views") }
    set :run, Proc.new { false }

    helpers do
      HUMAN_PREFIXES = %W(TB GB MB KB B).freeze

      alias_method :h, :escape_html

      def number_to_human_size(number)
        s = number.to_f
        i = HUMAN_PREFIXES.length - 1
        while s > 512 && i > 0
          i -= 1
          s /= 1024
        end
        ((s > 9 || s.modulo(1) < 0.1 ? '%d' : '%.1f') % s) + ' ' + HUMAN_PREFIXES[i]
      end

      def format_path(path)
        dirname  = File.dirname(path)
        basename = File.basename(path)
        if dirname == '.'
          "<strong>#{h basename}</strong>"
        else
          "#{h dirname}/<strong>#{h basename}</strong>"
        end
      end
    end

    before do
      response.headers['Content-Security-Policy'] = "default-src *; script-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; connect-src 'self'"
      response.headers['X-Content-Security-Policy'] = "default-src *; script-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; connect-src 'self'"
      response.headers['X-WebKit-CSP'] = "default-src *; script-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; connect-src 'self'"
    end

    get '/' do
      @orgs = Gitrob::Organization.all(:order => [:created_at.desc])
      erb :index
    end

    get '/orgs/:id' do
      @org = Gitrob::Organization.get(params['id'])
      @blobs_with_findings = @org.blobs.all(:findings_count.gt => 0)
      @repos = @org.repos.all(:order => [:owner_name, :name])
      erb :organization
    end

    get '/repos/:id' do
      @repo = Gitrob::Repo.get(params['id'])
      erb :repository
    end

    get '/ajax/users/:username' do
      if params['type'] == 'org'
        @user  = Gitrob::Organization.first(:name => params['username'])
        @repos = @user.repos.all(:user => nil)
      else
        @user  = Gitrob::User.first(:username => params['username'])
        @repos = @user.repos.all
      end
      erb :user, :layout => false
    end

    get '/ajax/blobs/:id' do
      @blob = Gitrob::Blob.get(params['id'])
      erb :blob, :layout => false
    end
  end
end