#coding=utf-8
# Redmine - project management software
# Copyright (C) 2006-2013  Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

class AccountController < ApplicationController
  helper :custom_fields
  include CustomFieldsHelper

  # prevents login action to be filtered by check_if_login_required application scope filter
  skip_before_filter :check_if_login_required
  skip_before_filter :check_authentication, :only => [:login, :logout, :user_join, :avatar, :authentication, :professional_certification, :security_settings, :change_psd, :user_info]
  before_filter :auth_login1, :only => [:avatar, :authentication, :professional_certification, :security_settings, :change_psd, :reset_psd, :user_info]
  skip_before_filter :verify_authenticity_token, :only =>[:codepedia_login, :login, :register]
  before_filter :require_login, only: [:avatar, :authentication, :professional_certification, :security_settings, :change_psd, :user_info, :user_auth, :apply_auth, :apply_pro_certification, :check_student_id,
                                        :bind_email, :change_or_bind]
  include ApplicationHelper
  include AccountHelper
  # Login request and validation
  CODES = %W(1 2 3 4 5 6 7 8 9 A B C D E F G H J K L N M O P Q R S T U V W X Y Z)

  def login
    Rails.logger.info("login: request type is #{request.method}")
    if params[:type] == "activated"
      @message = l(:notice_account_activated)
    elsif params[:type] == "expired"
      @message = l(:notice_account_expired)
    end
    @name = params[:name]
    @c_name = params[:c_name]

    login = User.current.login
    login_error = false
    # login 匹配不到字母,或者 含有特殊字符 则login不规范
    if (login =~ /(^(?=.*?[a-zA-Z]).*$)/).nil? || !(login =~ /[@#\$%\^&\*]+/).nil?
      login_error = true
    end

    if request.get?
      @login = params[:login] || true
      if User.current.logged?
        # 判断用户基本资料是否完善,不完善讲强制完善基本资料,完善进入主页
        user = UserExtensions.where(:user_id => User.current.id).first
        Rails.logger.info("#######################login_error: ##{login_error}")
        if User.current.lastname.blank? || user.school_id.blank? || user.identity.blank? || login_error
          redirect_to user_info_path()
        else
          redirect_back_or_default user_path(User.current), :referer => true
        end
      else
        render :layout => 'login'
      end
    else
      # ajax请求类型
      # REDO:测试的时候注意是否
      if request.xhr?
        login = params[:username].strip
        password = params[:password]
        # 验证用户名密码是否正确
        @user, last_login_on = User.try_to_login(login, password)
        if @user.present?
          Rails.logger.info("successful_authentication, user is #{@user.try(:login)}")
          # 登录重置session;重新开启session有效时间等
          self.logged_user = @user
          # generate a key and set cookie if autologin
          if params[:autologin] && Setting.autologin?
            set_autologin_cookie(@user)
          end
          # 记录用户登录行为
          UserActions.create(:action_id => @user.id, :action_type => "Login", :user_id => @user.id)
        end
        respond_to do |format|
          format.js
        end
      else
        authenticate_user
      end
    end
  end

  def codepedia_login
    logger.info("codepedia_login#########################################")
    logger.info("#{params}")
    user, last_login_on = User.try_to_login(params[:username], params[:password])
    logger.info(user)
    if user.blank?
      render :json => { status: 0 }
    else
      render :json => { status: 1, user: user}
    end
  end

  def user_join
    if params[:type] == "activated"
      @message = l(:notice_account_activated)
    elsif params[:type] == "expired"
      @message = l(:notice_account_expired)
    end

    if request.get?
      @login = params[:login] || true
      @name = params[:name]
      if User.current.logged?
        # 判断用户基本资料是否完善,不完善讲强制完善基本资料,完善进入主页
        user = UserExtensions.where(:user_id => User.current.id).first
        if user.gender.nil? || user.school_id.nil? || User.current.lastname.nil?
          redirect_to my_account_path(:tip => 1)
        elsif user.identity == 3 && user.school_id.nil?
          redirect_to my_account_path(:tip => 1)
        else
          redirect_to user_path(User.current)
        end
      else
        render :layout =>'login'
      end
    else
      authenticate_user
    end
  end

  def help
    @index  = params[:index].to_i == 0 ? 1 : params[:index].to_i
    if @index == 6 && !User.current.logged?
      redirect_to signin_path
      return
    end
    code = CODES.sample(8).join
    @resubmit = "#{code}"
    @agreement = Help.first
    @cooperation = Cooperation.all
    @url = params[:url]

    @com_coop_img = CooImg.where(:img_type => 'com_coop').order("position asc")
    @edu_coop_img = CooImg.where(:img_type => 'edu_coop').order("position asc")
    render :layout => 'base_edu'

  end

  def update_help
    @edu_coop = "edu_coop"
    @com_coop = "com_coop"
  end

  def update_agreement
    if User.current.admin?
      help = Help.first
      unless params[:tabs]
        if help.present?
          case params[:tab].to_i
            when 1
              help.update_attribute(:agreement, params[:description])
              redirect_to help_path(:index => 4)
            when 2
              help.update_attribute(:about_us, params[:description])
              redirect_to help_path()
            when 3
              help.update_attribute(:help_center, params[:description])
              redirect_to help_path(:index => 5)

          end
        else
          case params[:tab].to_i
            when  1
              Help.create(:agreement => params[:description])
              redirect_to help_path(:index => 4)
            when 2
              Help.create(:about_us => params[:description])
              redirect_to help_path()
            when 3
              Help.create(:help_center => params[:description])
              redirect_to help_path(:index => 5)
          end
        end
      else
        unless help.present?
          Help.create(:status =>params[:status])
          redirect_to help_path(:index => 2)

        else
          help.update_attribute(:status,params[:status])
          redirect_to help_path(:index => 2)
        end
      end
    else
      redirect_to help_path()
    end
  end

  def update_contact_us
    if Cooperation.where(:user_type => params[:user_type]).present?
      Cooperation.where(:user_type => params[:user_type]).first.update_attributes(:name => params[:name],:qq => params[:qq],:mail =>params[:mail])
    else
      Cooperation.create(:user_type => params[:user_type],:name =>params[:name],:qq =>params[:qq],:mail =>params[:mail])
    end
    redirect_to help_path(:index => 2)
  end

  def insert_suggest
    content = "<p>[#{params[:question_kind]}]</p>" + "<p>问题页面网址:#{params[:url]}</p>" + params[:description]
    PrivateMessage.create(:user_id => User.current.id, :target_id => 1, :sender_id => User.current.id, :receiver_id => 1, :content => content, :send_time => Time.now, :status => 1)
    PrivateMessage.create(:user_id => 1, :target_id => User.current.id, :sender_id => User.current.id, :receiver_id => 1, :content => content, :send_time => Time.now, :status => 0)
    redirect_to message_detail_user_path(User.current, :user_id => 1)
  end

  # 合作伙伴
  def cooperative_partner
    render :layout =>'base_edu'
  end

  def update_cooperative_part
    diskfile1 = disk_filename(params[:sourse_type], params[:source_id])
    diskfile2 = disk_coo_filename(params[:sourse_type], params[:source_id])

    diskfile = diskfile1 + 'temp'
    begin
      FileUtils.mv diskfile, diskfile1, force: true if File.exist? diskfile
    ensure
      File.delete(diskfile) if File.exist?(diskfile)
    end
    if File.exist?(diskfile1)
      pos = CooImg.order("position asc").last.position
      CooImg.create(:src_states =>params[:img_url] ,:url_states => diskfile2,:img_type =>params[:sourse_type], :position => pos)
    end
    redirect_to help_path(:index => 3)
  end

  # 改变广告位置
  # params: id: 广告的id, position:广告的新位置, type:图片类型
  def change_coop_position
    logger.info("##############{params[:position]}")
    position = params[:position].to_i
    type = params[:type]
    img = CooImg.find params[:id]
    coop_imgs = CooImg.where("img_type = ? and position > ?" , type, params[:position].to_i)
    coop_imgs.map{|img| img.increment!(:position)}
    img.update_attribute(:position, position + 1)
    render :json => {status: 1}
  end

  def delete_coop
    # @coo_img = CooImg.find_by_id(params[:id])
    # @coo_img.destroy
    # render_404 if @coo_img.nil?
    # redirect_to help_path(:index => 3)
    # rescue ActiveRecord::RecordNotFound
    # render_404
    @coo_img = CooImg.find_by_id(params[:id])
    @sourse = @coo_img.url_states
    diskfile =  File.join(Rails.root, "public")
    diskfile1 = diskfile + @sourse
    unless diskfile1.nil? || diskfile1 == ""
      path = File.dirname(diskfile1)
      if File.directory?(path)
        File.delete(diskfile1)
        @coo_img.destroy
      end
    end

    redirect_to help_path(:index => 3)
  rescue  Exception => e
    logger.info e.message
    respond_to do |format|
      format.js
      format.api {
        if saved
          render :action => 'upload', :status => :created
        else
          render_validation_errors(@avatar)
        end
      }
    end

  end

  # Log out current user and redirect to welcome page
  def logout
    if User.current.anonymous?
      redirect_to home_path
    else
      UserActions.create(:action_id => User.current.id, :action_type => "Logout", :user_id => User.current.id)
      logout_user
      # 记录用户登出行为
      redirect_to home_path
    end
    # display the logout form
  end

  def heartbeat
    render :json => session[:user_id]
  end

  # Lets user choose a new password
  def lost_password
    (redirect_to(signin_path); return) unless Setting.lost_password?
    if params[:token]
      @token = Token.find_token("recovery", params[:token].to_s)
      if @token.nil? || @token.expired?
        redirect_to signin_path
        return
      end
      @user = @token.user
      unless @user && @user.active?
        redirect_to signin_path
        return
      end
      if request.post?
        @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]
        if @user.save
          @token.destroy
          flash[:notice] = l(:notice_account_password_updated)
          redirect_to signin_url
          return
        end
      end
      render  :template => "account/password_recovery"
      return
    else
      if request.post?
        user = User.find_by_mail(params[:mail].to_s)
        # user not found or not active
        unless user && user.active?
          flash.now[:error] = l(:notice_account_unknown_email)
          render :layout => 'static_base'
          return
        end
        # user cannot change its password
        unless user.change_password_allowed?
          flash.now[:error] = l(:notice_can_t_change_password)
          return
        end
        # create a new token for password recovery
        token = Token.new(:user => user, :action => "recovery")
        if token.save
            Mailer.run.lost_password(token)
            flash[:notice] = l(:notice_account_lost_email_sent)
            redirect_to  lost_password_path
          return                      
        end
      end
      render :layout => 'login'
    end
  end

  # User self-registration
  def register
    (redirect_to(signin_path); return) unless Setting.self_registration? || session[:auth_source_registration]
    if request.get?
      session[:auth_source_registration] = nil
      @user = User.new(:language => current_language.to_s)
    else
      user_params = params[:user] || {}
      if session[:auth_source_registration]
        @user.activate
        @user.login = session[:auth_source_registration][:login]
        @user.auth_source_id = session[:auth_source_registration][:auth_source_id]
        if @user.save
          session[:auth_source_registration] = nil
          self.logged_user = @user
          flash[:notice] = l(:notice_account_activated)
          redirect_to my_account_path(:tip => 1)
        end
      else
        us = UsersService.new
        @user = us.register user_params.merge(:should_confirmation_password => false)
=begin
        case Setting.self_registration
        when '1'
          #register_by_email_activation(@user)
          unless @user.new_record?
            # if params[:user][:phone] =~ /^[a-zA-Z0-9]+([._\\]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/
            #   redirect_to account_email_valid_path(:mail => @user.mail, :user_id => @user.id)
            # else
              self.logged_user = @user
              redirect_to user_info_path()
            # end
            # flash[:notice] = l(:notice_account_register_done)
            # render action: 'email_valid', locals: {:mail => @user.mail}
          end
        when '3'
          #register_automatically(@user)
          if !@user.new_record?
            self.logged_user = @user
            flash[:notice] = l(:notice_account_activated)
            redirect_to user_info_path()
          else
            redirect_to signin_path
          end
        else
          #register_manually_by_administrator(@user)
          unless @user.new_record?
            account_pending
          end
        end
=end
        if !@user.new_record?
          self.logged_user = @user
          flash[:notice] = l(:notice_account_activated)
          redirect_to user_info_path()
        else
          redirect_to signin_path
        end

        if params[:user][:phone] =~ /^[a-zA-Z0-9]+([._\\]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/
          reward_grade(@user, @user.id, 'Mail', 500)
        elsif params[:user][:phone] =~ /^1\d{10}$/
          reward_grade(@user, @user.id, 'Phone', 500)
        end
      end
    end
  end

  # 注册完后绑定邮箱(可选)
  def bind_email
    @user = User.current
    if request.get?
      render :layout =>'login'
    else
      @user.update_attributes!(:mail => params[:mail])
      reward_grade(@user, @user.id, 'Mail', 500)
      redirect_to user_info_path()
    end
  end

  # 注册完/绑定邮箱 后完善资料
  def user_info
    @user = User.current

    #是否是Oschina过来的
    @is_ecoder_user = @user.ecoder_user_id.to_i>0

    #是否没设置过密码
    @is_set_password = @user.hashed_password.present?

    if request.get?

      # 如果是登录的请求进来,则需要判断登录名是否合法
      if (@user.login =~ /(^(?=.*?[a-zA-Z]).*$)/).nil? || !(@user.login =~ /[@#\$%\^&\*\.]+/).nil?
        @login_error = true
      end
      render :layout =>'login'
    else
      lg = @user.login
      @pref = @user.pref
      @se = @user.extensions

      # 已授权的用户修改单位名称,需要重新授权
      if @se.school_id != params[:occupation].to_i && @user.certification == 1
        @user.certification = 0
        apply_user = ApplyAction.where(:user_id => @user.id, :container_type => "TrialAuthorization")
        apply_user.update_all(:status => 2) unless apply_user.blank?
      end


      if @is_ecoder_user && !@is_set_password
        @user.password = params[:new_password]
        @user.password_confirmation = params[:new_password_confirmation]

        if @user.password.size<8
          @password_len_error = true
          render :user_info and return
        end

        if @user.password != @user.password_confirmation
          @password_match_error = true
          render :user_info and return
        end
      end

      @user.lastname = params[:lastname]
      @user.firstname = ""
      @user.show_realname = params[:hide_realname] ? 0 : 1
      @user.nickname = params[:hide_realname] ? params[:nickname] : params[:lastname]
      @user.pref.attributes = params[:pref]
      @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
      @user.mail = params[:mail] if params[:mail]
      Rails.logger.info("###############login: #{params[:login]}")
      if params[:login]
        if (params[:login] =~ /(^(?=.*?[a-zA-Z]).*$)/).present? && (params[:login] =~ /[@#\$%\^&\*\.]+/).nil?
          @user.login = params[:login]
          Gitlab.client.edit_user(@user.gid, :username => params[:login]) if @user.gid
        end
      end

      @se.school_id = params[:occupation]
      @se.department_id = params[:department_id]
      @se.gender = params[:sex]
      # @se.location = params[:province] if params[:province]
      # @se.location_city = params[:city] if params[:city]
      @se.identity = params[:identity].to_i if params[:identity]
      if @se.identity == 0
        @se.technical_title = params[:te_technical_title] if params[:te_technical_title]
        @se.student_id = nil
      elsif @se.identity == 1
        @se.student_id = params[:no] if params[:no]
        @se.technical_title = nil
      elsif @se.identity == 2
        @se.technical_title = params[:pro_technical_title] if params[:pro_technical_title]
        @se.student_id = nil
      end
      # @se.brief_introduction = params[:brief_introduction]

      if @user.save && @se.save

        reward_grade(@user, @user.id, 'Account', 500)

        if @user.certification != 1
          school_ids = School.where(:auto_users_trial => 1).map(&:id)
          # 授权单位中的只有学生身份才自动授权,且创建试用授权记录
          if !@se.school.nil? && school_ids.include?(@se.school_id) && @se.identity == 1
            @user.certification = 1
            @user.update_attributes(:certification => 1)
            apply_action = ApplyAction.where(:user_id => @user.id,  :container_type => "TrialAuthorization", :status => 0).first
            if apply_action.present?
              apply_action.update_attributes(:status => 1, :noticed => 1)
            else
              ApplyAction.create(:user_id => @user.id, :container_type => "TrialAuthorization", :ip_addr => request.remote_ip, :status => 1, :noticed => 1)
            end
          end
        end

        # 授权的教师加入示例课堂
        join_ex_course(@user) if @se.identity == 0 && @user.certification == 1

        @user.pref.save
        set_language_if_valid @user.language
        flash[:notice] = l(:notice_account_updated)
        first_update = Grade.where(:user_id => @user.id, :container_id => @user.id, :container_type => 'Account').first
        if @user.certification == 1 || (Time.now.to_i - first_update.created_at.to_i) < 86400
          if @user.certification != 1 && !@user.user_day_certifications.first.present? # 更新字段是为了在user页面弹框提示
            @user.update_attributes(:certification => 3)
            UserDayCertification.create(:user_id => @user.id, :status => 1)
          end
          redirect_to user_path(@user)
        else
          redirect_to my_account_url
        end
        return
      else
        @user.login = lg
        logger.info "save user: #{@user.errors}"
      end
    end
  end

  def check_email
    logger.info("###################################")
    user_count = User.where(:login => params[:login]).count
    status = user_count > 0 ? -1 : 0
    render :json => {status: status}
  end

  #should_confirmation_password是否验证密码
  def create_and_save_user login,password,email,password_confirmation,should_confirmation_password
    @user = User.new
    @user.admin = false
    @user.register
    @user.login = login
    @user.mail = email
    if should_confirmation_password && !password.blank? && !password_confirmation.blank?
      @user.password,@user.password_confirmation = password,password_confirmation
    elsif !should_confirmation_password &&  !password.blank?
      @user.password = password
    else
      @user.password = ""
    end
    case Setting.self_registration
      when '1'
        register_by_email_activation(@user)
      when '3'
        register_automatically(@user)
      else
        register_manually_by_administrator(@user)
    end
    if @user.id != nil
      ue = @user.user_extensions ||= UserExtensions.new
      ue.user_id = @user.id
      ue.save
    end
    @user
  end

  # Token based account activation
  def activate
    (redirect_to(signin_path); return) unless Setting.self_registration? && params[:token].present?
    token = Token.find_token('register', params[:token].to_s)
    type = l(:notice_account_expired) if (token && token.expired?)
    (redirect_to(signin_path(:type => "expired")); return) unless token and !token.expired?
    user = token.user
    (redirect_to(signin_path); return) unless user.registered?
    user.activate
    if user.save
      token.destroy
      flash[:notice] = l(:notice_account_activated)
    end
    redirect_to signin_url(:type => "activated")
  end

  def api_register login,password,email
    users_service = UsersService.new
    users_service.register({login: login, password: password, email: eamil})
  end

  def valid_ajax
    req = Hash.new(false)
    req[:message] = ''

    valid_attr = params[:valid]
    valid_value = params[:value]

    faker = User.new

    if valid_attr.eql?('')
      req[:valid] = User.where("phone = '#{params[:value]}' or mail = '#{params[:value]}' or login = '#{params[:value]}'").blank?
    end

    if valid_attr.eql?('login')
      faker.login = valid_value
      faker.valid?
      req[:valid] = faker.errors[:login].blank?
      req[:message] = faker.errors[:login]
    end

    if valid_attr.eql?('phone')
      faker.phone = valid_value
      faker.valid?
      req[:valid] = faker.errors[:phone].blank?
      req[:message] = ""
    end

    if valid_attr.eql?('mail')
      faker.mail = valid_value
      faker.valid?
      req[:valid] = faker.errors[:mail].blank?
      req[:message] = faker.errors[:mail]
    end

    req[:message] = l(:modal_valid_passing) if req[:message].blank?
    render :json => req
  end

  # 手机号或邮箱是否已注册
  def valid_register_user
    req = Hash.new(false)
    req[:message] = ''

    valid_attr = params[:valid]
    valid_value = params[:value]

    if valid_attr.eql?('phone')
      user = User.where(:phone => valid_value).first
      req[:valid] = !user.nil?
      req[:message] = user.nil? ? "该手机号未注册" : ""
    elsif valid_attr.eql?('mail')
      user = User.where(:mail => valid_value).first
      req[:valid] = !user.nil?
      req[:message] = user.nil? ? "该邮箱未注册" : ""
    end

    render :json => req
  end

  # 发送验证码:type 1:注册手机验证码 2:找回密码手机验证码 3:找回密码邮箱验证码 4:绑定手机 5:绑定邮箱 6:手机验证码登录 7:邮箱验证码登录 8:邮箱注册验证码
  # 验证码是否有效
  def valid_verification_code
    req = Hash.new(false)
    req[:valid] = false
    type = params[:type].to_i
    if Redmine::Configuration['gitlab_address'].include?("test") && params[:code] == "134790"
      req[:valid] = true
    else
      if type == 1 || type == 2 || type == 4 || type == 6 || params[:phone] =~ /^1\d{10}$/
        code = VerificationCode.where(:phone => params[:phone], :code => params[:code], :code_type => (params[:type].to_i != 1 && params[:type].to_i != 2 && params[:type].to_i != 4) ? 2 : params[:type].to_i ).last
      else
        code = VerificationCode.where(:email => params[:phone], :code => params[:code], :code_type => params[:type].to_i).last
      end
      req[:valid] = !code.nil? && (Time.now.to_i - code.created_at.to_i) <= 10*60
    end
    render :json => req
  end

  # 发送验证码:type 1:注册手机验证码 2:找回密码手机验证码 3:找回密码邮箱验证码 4:绑定手机 5:绑定邮箱 6:手机验证码登录 7:邮箱验证码登录 8:邮箱注册验证码
  def get_verification_code
    code = %W(0 1 2 3 4 5 6 7 8 9)
    type = params[:type].to_i
    req = Hash.new(false)
    req[:status] = 0
    req[:msg] = ''
    if type == 1
      if User.where(:phone => params[:value]).count > 0
        req[:status] = 2  #已注册
      else
        begin
          verification_code = code.sample(6).join
          status = Trustie::Sms.send(mobile: params[:value], code: verification_code)
          if status == 0
            VerificationCode.create(:phone => params[:value], :status => 1, :code_type => 1, :code => verification_code)
          end
          req[:msg] = code_msg status
        rescue => e
          Rails.logger.error "发送验证码出错: #{e}"
        end
        req[:status] = 1
      end
    elsif type == 8
      if User.where(:mail => params[:value]).count > 0
        req[:status] = 2  #已注册
      else
        begin
          verification_code = code.sample(6).join
          user = User.current
          token = Token.new(:user => user, :action => "bind")
          if token.save
            Mailer.run.email_register(token, verification_code, params[:value])
            VerificationCode.create(:email => params[:value], :status => 1, :code_type => 8, :code => verification_code)
          end
        rescue => e
          Rails.logger.error "发送验证码出错: #{e}"
        end
        req[:status] = 1
        req[:msg] = params[:value].split("@")[1]
      end
    elsif type == 2 || type == 3 || type == 6 || type == 7
      if params[:value] =~ /^[a-zA-Z0-9]+([._\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/
        if User.where(:mail => params[:value]).count == 0
          req[:status] = 2   #未注册
        else
          begin
            verification_code = code.sample(6).join
            user = User.where(:mail => params[:value]).first
            if type == 3
              token = Token.new(:user => user, :action => "recovery")
              if token.save
                Mailer.run.lost_password(token, verification_code)
                VerificationCode.create(:email => params[:value], :status => 1, :code_type => 3, :code => verification_code)
              end
            else
              token = Token.new(:user => user, :action => "login")
              if token.save
                Mailer.run.code_login(token, verification_code)
                VerificationCode.create(:email => params[:value], :status => 1, :code_type => 7, :code => verification_code)
              end
            end
          rescue => e
            Rails.logger.error "发送验证码出错: #{e}"
          end
          req[:status] = 3
          req[:link] = params[:value].split("@")[1]
        end
      elsif params[:value] =~ /^1\d{10}$/
        if User.where(:phone => params[:value]).count == 0
          req[:status] = 2
        else
          begin
            verification_code = code.sample(6).join
            status = Trustie::Sms.send(mobile: params[:value], code: verification_code)
            if status == 0
              VerificationCode.create(:phone => params[:value], :status => 1, :code_type => type, :code => verification_code)
            end
            req[:msg] = code_msg status
          rescue => e
            Rails.logger.error "发送验证码出错: #{e}"
          end
          req[:status] = 1
        end
      else
        req[:status] = 2
      end
    else
      if params[:value] =~ /^[a-zA-Z0-9]+([._\\]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/
        if User.where(:mail => params[:value]).count > 0
          req[:status] = 2  #已绑定
          req[:msg] = '该邮箱已被绑定'
        else
          begin
            verification_code = code.sample(6).join
            user = User.current
            token = Token.new(:user => user, :action => "bind")
            if token.save
              Mailer.run.bind_email(token, verification_code, params[:value])
              VerificationCode.create(:email => params[:value], :status => 1, :code_type => 5, :code => verification_code)
            end
          rescue => e
            Rails.logger.error "发送验证码出错: #{e}"
          end
          req[:status] = 3
          req[:msg] = params[:value].split("@")[1]
        end
      elsif params[:value] =~ /^1\d{10}$/
        if User.where(:phone => params[:value]).count > 0
          req[:status] = 2
          req[:msg] = '该手机号已被绑定'
        else
          begin
            verification_code = code.sample(6).join
            status = Trustie::Sms.send(mobile: params[:value], code: verification_code)
            if status == 0
              VerificationCode.create(:phone => params[:value], :status => 1, :code_type => 4, :code => verification_code)
            end
            req[:msg] = code_msg status
          rescue => e
            Rails.logger.error "发送验证码出错: #{e}"
          end
          req[:status] = 1
        end
      else
        req[:status] = 2
      end

    end
    Rails.logger.info "#{req[:status]} - #{req[:msg]}"
    render :json => req
  end

  def avatar
    @user = params[:user_id].nil? ? User.current : User.find(params[:user_id])
    @setting_type = 2
    render :layout => 'login'
  end

  # 实名认证
  def authentication
    @user = User.current
    @apply_user_auth = ApplyUserAuthentication.where(:user_id => @user.id, :auth_type => 1).order("created_at asc").last
    @setting_type = 3
    render :layout => 'login'
  end

  # 职业认证
  def professional_certification
    @user = User.current
    @apply_user_auth = ApplyUserAuthentication.where(:user_id => @user.id, :auth_type => 2, :status => [0, 2]).order("created_at asc").last
    @setting_type = 4
    render :layout => 'login'
  end

  def apply_auth
    @user = User.current
    old_name = @user.lastname+@user.firstname
    @user.lastname = params[:lastname].strip
    @user.firstname = ""
    @user.ID_number = params[:ID_number].blank? ? nil : params[:ID_number]

    if @user.save
      @user.update_attributes(:authentication => 0)
      if params[:upload_img] && params[:upload_img].to_i == 1
        diskfile1 = disk_auth_filename('UserAuthentication', @user.id, 'ID')
        diskfileID = diskfile1 + 'temp'
        begin
          FileUtils.mv diskfileID, diskfile1, force: true if File.exist? diskfileID
        ensure
          File.delete(diskfileID) if File.exist?(diskfileID)
        end
      end
      # 提交认证
      if params[:save_or_submit] && params[:save_or_submit] == "1"
        if ApplyUserAuthentication.where(:user_id => @user.id, :status => 0, :auth_type => 1).count == 0
          ApplyUserAuthentication.create(:user_id => @user.id, :status => 0, :auth_type => 1)
          begin
            status = Trustie::Sms.send(mobile: '18173242757', send_type:'apply_auth' , name: '管理员')
          rescue => e
            Rails.logger.error "发送验证码出错: #{e}"
          end
        end
      end
      # 已授权的用户修改真实姓名,需要重新授权
      if @user.certification == 1 && old_name != params[:lastname]
        school_ids = School.where(:auto_users_trial => 1).map(&:id)
        if !(((@user.user_extensions.identity == 1 && @user.user_extensions.student_id.present?) || @user.user_extensions.identity == 0) && !@user.user_extensions.school.nil? && school_ids.include?(@user.user_extensions.school_id))
          @user.update_attributes(:certification => 0)
          apply_user = ApplyAction.where(:user_id => @user.id, :container_type => "TrialAuthorization")
          apply_user.update_all(:status => 2) unless apply_user.blank?
        end
      end
    end
    redirect_to my_account_path
  end

  def apply_pro_certification
    @user = User.current
    @se = @user.extensions
    # 已授权的用户修改单位名称,需要重新授权
    if (@se.school_id != params[:occupation].to_i || @se.identity != params[:identity].to_i) && @user.certification == 1
      @user.certification = 0
      apply_user = ApplyAction.where(:user_id => @user.id, :container_type => "TrialAuthorization")
      apply_user.update_all(:status => 2) unless apply_user.blank?
    end
    @se.school_id = params[:occupation]
    @se.department_id = params[:department_id]
    @se.identity = params[:identity].to_i if params[:identity]
    if @se.identity == 0
      @se.technical_title = params[:te_technical_title] if params[:te_technical_title]
      @se.student_id = nil
    elsif @se.identity == 1
      @se.student_id = params[:no] if params[:no]
      @se.technical_title = nil
    elsif @se.identity == 2
      @se.technical_title = params[:pro_technical_title] if params[:pro_technical_title]
      @se.student_id = nil
    end
    if @user.save && @se.save
      @user.update_attributes(:professional_certification => 0)
      if params[:upload_img] && params[:upload_img].to_i == 1
        diskfile2 = disk_auth_filename('UserAuthentication', @user.id, 'PRO')
        diskfilePRO = diskfile2 + 'temp'
        begin
          FileUtils.mv diskfilePRO, diskfile2, force: true if File.exist? diskfilePRO
        ensure
          File.delete(diskfilePRO) if File.exist?(diskfilePRO)
        end
      end

      # 提交认证
      if params[:save_or_submit] && params[:save_or_submit] == "1"
        if @se.identity == 1
          if ApplyUserAuthentication.where(:user_id => @user.id, :status => 0, :auth_type => 2).count == 0
            ApplyUserAuthentication.create(:user_id => @user.id, :status => 0, :auth_type => 2)
            begin
              status = Trustie::Sms.send(mobile: '18173242757', send_type:'apply_pro_certification' , name: '管理员')
            rescue => e
              Rails.logger.error "发送验证码出错: #{e}"
            end
          end
        else
          if File.exist?(diskfile2)
            ApplyUserAuthentication.create(:user_id => @user.id, :status => 0, :auth_type => 2)
            begin
              status = Trustie::Sms.send(mobile: '18173242757', send_type:'apply_pro_certification' , name: '管理员')
            rescue => e
              Rails.logger.error "发送验证码出错: #{e}"
            end
          end
        end
      end

      # 只对试用授权的用户处理,修改职业信息的时候,如果变成了教师,则判断用户是否已加入示例课堂,没有则将其加入
      if @se.identity == 0 && @user.certification == 1
        join_ex_course @user
      end
    end
    redirect_to my_account_path
  end

  # 修改资料时判断学号是否已使用
  def check_user_student_id
    data = {result:0, account:""}
    if params[:student_id] && params[:school_id]
      if UserExtensions.where("student_id = '#{params[:student_id]}' and school_id = #{params[:school_id]} and user_id != #{User.current.id}").count > 0
        user = User.where(:id => UserExtensions.where("student_id = '#{params[:student_id]}' and school_id = #{params[:school_id]} and user_id != #{User.current.id}").map(&:user_id)).first
        data[:account] = user.mail.blank? ? user.user_phone : user.user_mail
      else
        data[:result] = 1
      end
    end
    render :json => data
  end

  # 实名认证时判断学号是否已使用
  def check_student_id
    data = {result:0, account:""}
    if params[:student_id] && params[:school_id]
      auth_count = User.where(:id => UserExtensions.where(:student_id => params[:student_id], :school_id => params[:school_id]).map(&:user_id)).count
      # apply_count = ApplyUserAuthentication.where(:status => 0, :user_id => User.where(:id => UserExtensions.where(:student_id => params[:student_id], :school_id => params[:school_id]).map(&:user_id), :professional_certification => 0).map(&:id)).count
      if auth_count == 0
        data[:result] = 1
      else
        user = User.where(:id => UserExtensions.where(:student_id => params[:student_id], :school_id => params[:school_id]).map(&:user_id)).first
        if user != User.current
          data[:account] = user.mail.blank? ? user.user_phone : user.user_mail
        else
          data[:result] = 1
        end
      end
    end
    render :json => data
  end

  # 实名认证时判断证件号码是否已使用
  def check_id_number
    data = {result:0, account:""}
    if params[:id_number]
      id_number = [params[:id_number].downcase, params[:id_number].upcase]
      auth_count = User.where(:ID_number => id_number, :authentication => 1).count
      apply_count = ApplyUserAuthentication.where(:status => 0, :user_id => User.where(:ID_number => id_number, :authentication => 0).map(&:id)).count
      if auth_count == 0 && apply_count == 0
        data[:result] = 1
      else
        user = auth_count != 0 ? User.where(:ID_number => id_number, :authentication => 1).first : ApplyUserAuthentication.where(:status => 0, :user_id => User.where(:ID_number => id_number, :authentication => 0).map(&:id)).first.user
        if user != User.current
          data[:account] = user.mail.blank? ? user.user_phone : user.user_mail
        else
          data[:result] = 1
        end
      end
    end
    render :json => data
  end

  def cancel_pro_apply
    unless params[:auth_type] == "2" && User.current.professional_certification
      @apply_user_auth = ApplyUserAuthentication.where(:user_id => User.current.id, :auth_type => params[:auth_type], :status => 0).first
      if @apply_user_auth.present?
        @apply_user_auth.tidings.destroy_all
        @apply_user_auth.update_attribute('status', 3)
        diskfile2 = disk_auth_filename('UserAuthentication', User.current.id, params[:auth_type].to_i == 1 ? 'ID' : 'PRO')
        diskfilePRO = diskfile2 + 'temp'
        FileUtils.rm diskfilePRO, :force => true
        FileUtils.rm diskfile2, :force => true
      end
    end

    @user = User.current
    respond_to do |format|
      format.js
      format.html {
        if params[:auth_type] == "1"
          redirect_to authentication_account_path
        else
          redirect_to professional_certification_account_path
        end
      }
    end

  end

  def apply_trail
    apply_action = ApplyAction.where(:user_id => User.current.id, :container_type => "TrialAuthorization", :status => 0).first
    school_ids = School.where(:auto_users_trial => 1).map(&:id)
    user_ex = User.current.user_extensions
    if user_ex.identity == 1 && user_ex.student_id.present? && !user_ex.school.nil? && school_ids.include?(user_ex.school_id)
      User.current.update_attributes(:certification => 1)
      logger.warn("apply_trail #######{User.current.login} ****#{User.current.user_extensions.school_id}")
      @tip = "申请已提交,我们将在1分钟内完成审核"
      unless apply_action.present?
        ApplyAction.create(:user_id => User.current.id, :status => 1, :ip_addr => request.remote_ip, :container_type => "TrialAuthorization", :apply_reason => params[:apply_reason])
      else
        apply_action.update_attributes(:status => 1)
      end
      # begin
      #   if User.current.phone.present?
      #     status = Trustie::Sms.send(mobile:User.current.phone.to_s, send_type:'trial_authorization' ,user_name:User.current.show_name,result:'已通过')
      #   end
      # rescue => e
      #   Rails.logger.error "发送验证码出错: #{e}"
      # end
    elsif !User.current.user_extensions.school.nil?
      @tip = "申请已提交,我们将在5分钟内完成审核"
      unless apply_action.present?
        ApplyAction.create(:user_id => User.current.id, :status => 0, :ip_addr => request.remote_ip, :container_type => "TrialAuthorization", :apply_reason => params[:apply_reason])
        begin
          status = Trustie::Sms.send(mobile:17680641960, send_type:'user_apply_auth',name:'管理员' )
        rescue => e
          Rails.logger.error "发送验证码出错: #{e}"
        end
      end
    end
    if params[:from_user] && params[:from_user] == '1'
      @url = "#{user_path(User.current)}"
    else
      @url = "#{my_account_path}"
    end
    respond_to do |format|
      format.js
    end
  end

  def user_auth
    @user = User.current
    diskfile1 = disk_auth_filename('UserAuthentication', @user.id, 'ID')
    diskfile2 = disk_auth_filename('UserAuthentication', @user.id, 'PRO')
    diskfileID = diskfile1 + 'temp'
    diskfilePRO = diskfile2 + 'temp'
    begin
      FileUtils.mv diskfileID, diskfile1, force: true if File.exist? diskfileID
      FileUtils.mv diskfilePRO, diskfile2, force: true if File.exist? diskfilePRO
    ensure
      File.delete(diskfileID) if File.exist?(diskfileID)
      File.delete(diskfilePRO) if File.exist?(diskfilePRO)
    end
    if File.exist?(diskfile1) && File.exist?(diskfile2)
      ApplyUserAuthentication.create(:user_id => @user.id, :status => 0)
    end

    redirect_to authentication_account_path
  end

  def security_settings
    @user = User.current
    @setting_type = 5
    render :layout => 'login'
  end

  def change_psd
    @user = User.current
    @setting_type = 5
    render :layout => 'login'
  end

  # 修改密码时判断密码是否输入正确
  def valid_psd
    @user = User.current
    req = Hash.new(false)
    req[:valid] = false
    req[:valid] = @user.check_password?(params[:value])
    render :json => req
  end

  def change_or_bind
    @user = User.current
    @type = params[:type]
    @setting_type = 5
    render :layout => 'login'
  end

  def bind_email_or_phone
    @user = User.current
    begin
      ActiveRecord::Base.transaction do
        if params[:type] == "phone"
          @user.update_attributes!(:phone => params[:value])
          reward_grade(@user, @user.id, 'Phone', 500)
        else
          @user.update_attributes!(:mail => params[:value])
          # Gitlab.client.edit_user_email(@user.gid, :email => @user.mail) if @user.gid
          reward_grade(@user, @user.id, 'Mail', 500)
        end
      end
    rescue
      raise ActiveRecord::Rollback
    end
    redirect_to my_account_path
  end

  def phone_bind
    if request.get?
      render :layout =>'login'
    else
      User.current.update_attributes!(:phone => params[:phone])
      reward_grade(User.current, User.current.id, 'Phone', 500)
      redirect_to user_path(User.current)
    end
  end

  def unbind_phone
    if User.current.mail.blank?
      User.current.update_attribute('phone', nil)
      User.current.lock!
      redirect_to signin_path
    else
      User.current.update_attribute('phone', nil)
      redirect_to my_account_path
    end
  end

  def unbind_mail
    if User.current.phone.blank?
      User.current.update_attribute('mail', nil)
      User.current.lock!
      redirect_to signin_path
    else
      User.current.update_attribute('mail', nil)
      redirect_to my_account_path
    end
  end

  def wechat_bind
    respond_to do |format|
      format.html { render :layout => "login_bigdata"}
    end
  end

  def reset_psd
    if params[:lost_psd_phone] && params[:lost_psd_phone].strip != ""
      @user = User.where("phone = '#{params[:lost_psd_phone].to_s}'").first
      code = VerificationCode.where(:phone => params[:lost_psd_phone], :code => params[:code], :code_type => 2).last

    elsif params[:lost_psd_email] && params[:lost_psd_email].strip != ""
      @user = User.where("mail = '#{params[:lost_psd_email].to_s}'").first
      code = VerificationCode.where(:email => params[:lost_psd_email], :code => params[:code], :code_type => 3).last
    end

    if !code.nil? && (Time.now.to_i - code.created_at.to_i) <= 10*60
      if @user.present?
        @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]
        if @user.save
          Token.where(:user_id => @user, :action => "recovery").destroy_all
          respond_to do |format|
            format.js
          end
        else
          redirect_to signin_path
          return
        end
      else
        redirect_to signin_path
        return
      end
    else
      @status = 0
    end
  end

  def email_valid
    begin
      @mail_type = params[:mail].split("@")[1]
      @user = User.find(params[:user_id])
    rescue
      return render_404
    end
    respond_to do |format|
      format.html { render :layout => "login_bigdata"}
      format.js
    end
  end

  def resendmail
    result = {:status=>1, :email=>""}
    user = User.find(params[:user]) if params[:user]
    result[:email] = user.mail
    token = Token.new(:user => user, :action => "register")
    if token.save
      # Mailer.run.register(token)
      Mailer.register(token).deliver
    else
      yield if block_given?
      result[:status] = 0
    end
    render :json => result
  end

  def change_email
    user = User.find params[:user_id].to_i
    user.update_attributes(:mail => params[:value])
    token = Token.create(:user => user, :action => "register")
    Mailer.run.register(token)
    result = {:email => user.mail, :email_link => user.mail.split("@")[1]}

    render :json => result
  end

  def email_activation

  end

  def gold_record
    @user = User.current
    # 用户签到情况
    attendance = Attendance.where(:user_id => @user).first
    @can_attendance = true
    @next_attachment_score = 5
    if attendance.present?
      if time_between_days(Time.now, attendance.created_at) == 0
        @can_attendance = false
      end
      @next_attachment_score = attendance.next_score
    end
    @type = params[:type] ? params[:type].to_i : 0
    @user_grades = @type == 0 ? @user.grades.reorder("created_at desc") : @type == 1 ? @user.grades.where("score > 0").reorder("created_at desc") : @type == 2 ?  @user.grades.where("score < 0").reorder("created_at desc") : []
    @user_grades = paginateHelper @user_grades, 8
    @setting_type = 7
    respond_to do |format|
      format.js
      format.html{render :layout => 'base_edu_user'}
    end
  end

  def experience_record
    @user = User.current
    # 用户评测情况
    @evaluate = Output.where(:game_id => @user.games.map(&:id)).reorder("created_at desc").first

    @user_experiences = @user.experiences.reorder("created_at desc")
    @user_experiences = paginateHelper @user_experiences, 8
    @setting_type = 8
    respond_to do |format|
      format.js
      format.html{render :layout => 'base_edu_account'}
    end
  end

  private

  def authenticate_user
    Rails.logger.info("authenticate_user start")
    if Setting.openid? && using_open_id?
      Rails.logger.info("authenticate_user start1")
      open_id_authenticate(params[:openid_url])
    elsif params[:code]
      Rails.logger.info("authenticate_user start2")
      code_authentication
    else
      Rails.logger.info("authenticate_user start3")
      password_authentication
    end
  end

  def password_authentication
    user, last_login_on = User.try_to_login(params[:username], params[:password])
    Rails.logger.info("password_authentication: params[:username] is #{params[:username]}, user is #{user}")

    if user.nil?
      Rails.logger.info("password_authentication: successful_authentication1")
      invalid_credentials
    elsif user.status == 2
      Rails.logger.info("password_authentication: successful_authentication2")
      @user = user
      invalid_credentials_new
    elsif user.new_record?
      Rails.logger.info("password_authentication: successful_authentication3")
      onthefly_creation_failed(user, {:login => user.login, :auth_source_id => user.auth_source_id })
    else
      # Valid user
      Rails.logger.info("password_authentication: successful_authentication4")
      successful_authentication(user, last_login_on)
    end
  end

  def code_authentication
    if params[:username] =~ /^[a-zA-Z0-9]+([._\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/
      code = VerificationCode.where(:email => params[:username], :code => params[:code], :code_type => 7).last
      user = User.where(:mail => params[:username]).first
    elsif params[:username] =~ /^1\d{10}$/
      code = VerificationCode.where(:phone => params[:username], :code => params[:code], :code_type => 6).last
      user = User.where(:phone => params[:username]).first
    end

    if user && code && (Time.now.to_i - code.created_at.to_i) <= 10*60
      user.update_column(:last_login_on, Time.now)
      successful_authentication(user, user.last_login_on.nil? ? '' : user.last_login_on.to_s)
    else
      logger.warn "Failed login for '#{params[:username]}' from #{request.remote_ip} at #{Time.now.utc}"
      flash[:error] = l(:notice_account_invalid_code)
      redirect_to signin_path(:c_name=>params[:username])
    end
  end

  def open_id_authenticate(openid_url)
    back_url = signin_url(:autologin => params[:autologin])

    authenticate_with_open_id(openid_url, :required => [:nickname, :fullname, :email], :return_to => back_url, :method => :post) do |result, identity_url, registration|
      if result.successful?
        user = User.find_or_initialize_by_identity_url(identity_url)
        if user.new_record?
          # Self-registration off
          (redirect_to(signin_path); return) unless Setting.self_registration?

          # Create on the fly
          user.login = registration['nickname'] unless registration['nickname'].nil?
          user.mail = registration['email'] unless registration['email'].nil?
          user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil?
          user.random_password
          user.register

          case Setting.self_registration
          when '1'
            register_by_email_activation(user) do
              onthefly_creation_failed(user)
            end
          when '3'
            register_automatically(user) do
              onthefly_creation_failed(user)
            end
          else
            register_manually_by_administrator(user) do
              onthefly_creation_failed(user)
            end
          end
        else
          # Existing record
          if user.active?
            successful_authentication(user)
          else
            account_pending
          end
        end
      end
    end
  end

  def successful_authentication(user, last_login_on)
    logger.info "Successful authentication for '#{user.login}' from #{request.remote_ip} at #{Time.now.utc}"
    # Valid user
    self.logged_user = user
    # generate a key and set cookie if autologin
    if params[:autologin] && Setting.autologin?
      set_autologin_cookie(user)
    end
    call_hook(:controller_account_success_authentication_after, {:user => user })

    code = /\d*/
    # 记录用户登录行为

    UserActions.create(:action_id => User.current.id, :action_type => "Login", :user_id => User.current.id)
=begin
    if user.created_on.strftime('%Y-%m-%d %H:%M:%S') > "2018-01-01 00:00:00" && user.phone.blank?
      redirect_to change_or_bind_path(:type => 'phone')
      return
    end
=end
    #根据home_url生产正则表达式
    eval("code = " + "/^" + home_url.gsub(/\//,"\\\/") + "\\\/*(welcome)?\\\/*(\\\/index\\\/*.*)?\$/")
    login_error = false
    if (User.current.login =~ /(^(?=.*?[a-zA-Z]).*$)/).nil? || !(User.current.login =~ /[@#\$%\^&\*]+/).nil?
      login_error = true
    end

    if (code=~params[:back_url] || params[:back_url].to_s.include?('lost_password')) && last_login_on != '' && !login_error
      # enroll_status_cookie(user)
      redirect_to user_path(user,host: Setting.host_user)
    else
      if last_login_on == ''
        redirect_to my_account_url
      else
      #by young
      #redirect_back_or_default my_page_path
      # 基本资料不完善的用户,将强制用户完善基本资料。
       user = UserExtensions.where(:user_id => User.current.id).first
       if User.current.lastname.blank? || user.school_id.blank? || user.identity.blank? || login_error
         redirect_to user_info_path()
       else
         # enroll_status_cookie(User.current)
         redirect_back_or_default User.current, params[:back_url]
       end
      end
    end
  end

  def set_autologin_cookie(user)
    token = Token.get_or_create_permanent_login_token(user)
    cookie_options = {
      :value => token.value,
      :expires => 1.month.from_now,
      :path => (Redmine::Configuration['autologin_cookie_path'] || '/'),
      :secure => (Redmine::Configuration['autologin_cookie_secure'] ? true : false),
      :httponly => true
    }
    if Redmine::Configuration['cookie_domain'].present?
      cookie_options = cookie_options.merge(domain: Redmine::Configuration['cookie_domain'])
    end
    cookies[autologin_cookie_name] = cookie_options
  end

  # Onthefly creation failed, display the registration form to fill/fix attributes
  def onthefly_creation_failed(user, auth_source_options = { })
    @user = user
    session[:auth_source_registration] = auth_source_options unless auth_source_options.empty?
    render :action => 'register'
  end

  def invalid_credentials
    logger.warn "Failed login for '#{params[:username]}' from #{request.remote_ip} at #{Time.now.utc}"
    flash[:error] = l(:notice_account_invalid_creditentials)
    # render :layout => 'login'
    redirect_to signin_path(:name=>params[:username])
  end
  
  def invalid_credentials_new
    logger.warn "Failed login for '#{params[:username]}' from #{request.remote_ip} at #{Time.now.utc}"
    # flash[:error] = l(:notice_account_invalid_creditentials_new)
    # render signin_path(:login=>true)
    render :action => 'email_activation',:layout => 'login_bigdata'
  end

  # Register a user for email activation.
  #
  # Pass a block for behavior when a user fails to save
  def register_by_email_activation(user, &block)
    token = Token.new(:user => user, :action => "register")
    if user.save and token.save
      UserStatus.create(:user_id => user.id, :changsets_count => 0, :watchers_count => 0)
      Mailer.run.register(token)


      flash[:notice] = l(:notice_account_register_done)

      render action: 'email_valid', locals: {:mail => user.mail}
    else
      yield if block_given?
    end
  end

  # Automatically register a user
  #
  # Pass a block for behavior when a user fails to save
  def register_automatically(user, &block)
    # Automatic activation
    user.activate
    user.last_login_on = Time.now
    if user.save
      UserStatus.create(:user_id => user.id, :changsets_count => 0, :watchers_count => 0)
      self.logged_user = user
      flash[:notice] = l(:notice_account_activated)
      redirect_to my_account_url
    else
      yield if block_given?
    end
  end

  # Manual activation by the administrator
  #
  # Pass a block for behavior when a user fails to save
  def register_manually_by_administrator(user, &block)
    if user.save
      UserStatus.create(:user_id => user.id ,:changsets_count => 0, :watchers_count => 0)
      # Sends an email to the administrators
      Mailer.run.account_activation_request(user)
      account_pending
    else
      yield if block_given?
    end
  end

  def account_pending
    flash[:notice] = l(:notice_account_pending)
    redirect_to signin_url
  end
end