class AccountController < ApplicationController

  observer :user_observer

  # say something nice, you goof!  something sweet.
  def index
    if not logged_in?
      redirect_to(:action => 'login') 
    else
      redirect_to(:controller =>'admin', :action => 'index')
    end
  end

  def login
    return unless request.post?
    self.current_user = User.authenticate(params[:login], params[:password])
    if current_user
      redirect_back_or_default(:controller => '/account', :action => 'index')
      flash[:notice] = "Logged in successfully"
    else
      flash[:notice] = 'Login Failed.  Please try again.'  
    end
  end

  def reminder
    return unless request.post?
    e = params[:email]
    if e =~ /^[a-zA-Z]([.]?([[:alnum:]_-]+)*)?@([[:alnum:]\-_]+\.)+[a-zA-Z]{2,4}$/
      @user = User.find_by_email(e)
      flash[:notice] = "Sent reminder email with new password to ", e
      if @user
        @user.make_new_password!
        UserNotifier.deliver_reminder(@user) 
      end
    end
  end

  def signup
    @user = User.new(params[:user])
    return unless request.post?
    if @user.save
      # Check to see if this is first signup. If so, make this a site_admin by default.
      if User.count == 1
        @user.has_role 'site_admin'
      end
      redirect_back_or_default(:controller => '/home', :action => 'index')
      flash[:notice] = "Thanks for signing up!  Please check your email to activate the account."
    end
  end

  def update
    permit 'authenticated' do
      @user = User.find(current_user.id)
      if request.post?
        if ((params[:user][:fullname] != @user.fullname) or
            (params[:user][:email] != @user.email))
          # current resource -> user mapping depends on email - must be updated
          @r_up = Resource.find(:all, :conditions => "contact_email = '#{@user.email}'")
  #        logger.info "MATCHED: " + @r_up.length.to_s + @user.email
          @r_up.each do |resource|
  #          logger.info "UPDATING" + resource.name + ": " + resource.contact_email
            resource.update_attribute(:contact_email, params[:user][:email]) 
            resource.update_attribute(:contact_name, params[:user][:fullname])
          end        
        end
          
        if @user.update_attributes(params[:user])
          UserNotifier.deliver_update_notification(@user)  #FIX move to observer?
          redirect_back_or_default(:controller => '/admin', :action => 'index')
          flash[:notice] = "Your account has been updated.  You have been sent an email confirmation."
        end      
      else
        @user = User.find(current_user.id)
      end
    end
  end

  
  def logout
    self.current_user = nil
    flash[:notice] = "You have been logged out."
    redirect_back_or_default(:controller => '/home', :action => 'index')
  end


  def activate
    @user = User.find_by_activation_code(params[:id])
    if @user and @user.activate
      self.current_user = @user
      flash[:notice] = "Your account has been activated." 
    else
      flash[:notice] = "Incorrect activation code." 
    end
    redirect_back_or_default(:controller => '/home', :action => 'index')
  end

end
