class MainController < ApplicationController

  before_filter :authenticate, :except => [:index, :login]

  verify :method => :post, :only => [:submit],
         :redirect_to => { :action => :index }

  def index
  end

  def login
    reset_session
  end

  def list
    @problems = Problem.find_available_problems
    @prob_submissions = Array.new
    @user = User.find(session[:user_id])
    @problems.each do |p|
      c, sub = Submission.find_by_user_and_problem(@user.id,p.id)
      @prob_submissions << [c,sub]
    end
  end

  def submit
    submission = Submission.new(params[:submission])
    submission.user_id = session[:user_id]
    submission.language_id = 0
    source = params['file'].read
    if source.length > 100_000
      flash[:notice] = 'Error: file too long'
    elsif (lang = Submission.find_language_in_source(source))==nil
      flash[:notice] = 'Error: cannot determine language used'
    elsif ((submission.problem_id==-1) and 
	   !(problem=Submission.find_problem_in_source(source)))
      flash[:notice] = 'Error: cannot determine problem submitted'
    elsif ((submission.problem_id==-1) and
	   (problem.available == false))
      flash[:notice] = 'Error: problem is not available'
    else
      submission.problem_id = problem.id if submission.problem_id == -1
      submission.source = source
      submission.language_id = lang.id
      submission.submitted_at = Time.new
      if submission.save == false
	flash[:notice] = 'Error saving your submission'
      elsif Task.create(:submission_id => submission.id) == false
	flash[:notice] = 'Error adding your submission to task queue'
      end
    end
    redirect_to :action => 'list'
  end

  def get_source
    submission = Submission.find(params[:id])
    if submission.user_id == session[:user_id]
      fname = submission.problem.name + '.' + submission.language.ext
      send_data(submission.source, 
		{:filename => fname, 
                  :type => 'text/plain'})
    else
      flash[:notice] = 'Error viewing source'
    end
  end
end
