require 'tmail'
require 'net/smtp'

class UsersController < ApplicationController

  before_filter :authenticate, :except => [:new, :register, :confirm]

  before_filter :verify_online_registration, :only => [:new, :register]

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

  #in_place_edit_for :user, :alias_for_editing
  #in_place_edit_for :user, :email_for_editing

  def index
    if !Configuration['system.user_setting_enabled']
      redirect_to :controller => 'main', :action => 'list'
    else
      @user = User.find(session[:user_id])
    end
  end

  def chg_passwd
    user = User.find(session[:user_id])
    user.password = params[:passwd]
    user.password_confirmation = params[:passwd_verify]
    if user.save
      flash[:notice] = 'password changed'
    else
      flash[:notice] = 'Error: password changing failed'
    end
    redirect_to :action => 'index'
  end

  def new
    @user = User.new
    render :action => 'new', :layout => 'empty'
  end

  def register
    if(params[:cancel])
      redirect_to :controller => 'main', :action => 'login'
      return
    end
    @user = User.new(params[:user])
    @user.password_confirmation = @user.password = User.random_password
    @user.activated = false
    if (@user.valid?) and (@user.save)
      if send_confirmation_email(@user)
        render :action => 'new_splash', :layout => 'empty'
      else
        @admin_email = Configuration['system.admin_email']
        render :action => 'email_error', :layout => 'empty'
      end
    else
      @user.errors.add_to_base("Email cannot be blank") if @user.email==''
      render :action => 'new', :layout => 'empty'
    end
  end

  def confirm
    login = params[:login]
    key = params[:activation]
    @user = User.find_by_login(login)
    if (@user) and (@user.verify_activation_key(key))
      if @user.valid?  # check uniquenss of email
        @user.activated = true
        @user.save
        @result = :successful
      else
        @result = :email_used
      end
    else
      @result = :failed
    end
    render :action => 'confirm', :layout => 'empty'
  end

  protected

  def verify_online_registration
    if !Configuration['system.online_registration']
      redirect_to :controller => 'main', :action => 'login'
    end
  end

  def send_confirmation_email(user)
    contest_name = Configuration['contest.name']
    admin_email = Configuration['system.admin_email']
    activation_url = url_for(:action => 'confirm', 
                             :login => user.login, 
                             :activation => user.activation_key)
    home_url = url_for(:controller => 'main', :action => 'index')
    mail = TMail::Mail.new
    mail.to = user.email
    mail.from = Configuration['system.online_registration.from']
    mail.subject = "[#{contest_name}] Confirmation"
    mail.body = t('registration.email_body', {
                    :full_name => user.full_name,
                    :contest_name => contest_name,
                    :login => user.login,
                    :password => user.password,
                    :activation_url => activation_url,
                    :admin_email => admin_email
                  })

    logger.info mail.body

    smtp_server = Configuration['system.online_registration.smtp']

    begin
      Net::SMTP.start(smtp_server) do |smtp|
        smtp.send_message(mail.to_s, mail.from, mail.to)
      end
      result = true
    rescue
      result = false
    end

    return result
  end
  
end
