class UsersService
  include ApplicationHelper
  include AccountHelper
  include AvatarHelper
  include CoursesHelper
  include ApiHelper
  #将用户注册的功能函数写这里
  #参数约定
  #成功返回注册后的User实例,失败直接抛异常

  def register(params)
    @user = User.new
    @user.admin = false
    @user.register
    @user.login = params[:login]
    @user.mail = params[:mail]
    password = params[:password]
    password_confirmation = params[:password_confirmation]
    should_confirmation_password = params[:should_confirmation_password]
    if !password.blank? && !password_confirmation.blank? && should_confirmation_password
      @user.password, @user.password_confirmation = password, password_confirmation
    elsif !password.blank? && !should_confirmation_password
      @user.password = password
    else
      @user.password = ""
    end
    case Setting.self_registration
      when '1'
        @user = email_activation_register(@user)
      when '3'
        @user = automatically_register(@user)
      else
        @user = administrator_manually__register(@user)
    end
    if @user.id != nil
      ue = @user.user_extensions ||= UserExtensions.new
      ue.user_id = @user.id
      ue.save
    end
    @user
    #img_url = url_to_avatar(@user)
    #gender = @user.user_extensions.gender.nil? ? 0 : @user.user_extensions.gender
    #work_unit = get_user_work_unit @user
    #location = get_user_location @user
    #{:id => @user.id, :img_url => img_url, :nickname => @user.login, :gender => gender, :work_unit => work_unit, :mail => @user.mail, :location => location, :brief_introduction => @user.user_extensions.brief_introduction}
  end

  # 自动注册功能 FOR:邮件邀请
  def register_auto(login,mail,password)
    @user = User.new
    @user.admin = false
    @user.register
    @user.login = login
    @user.mail = mail
    password_confirmation = password
    should_confirmation_password = true
    if !password.blank? && !password_confirmation.blank? && should_confirmation_password
      @user.password, @user.password_confirmation = password, password_confirmation
    elsif !password.blank? && !should_confirmation_password
      @user.password = password
    else
      @user.password = ""
    end
    @user = automatically_register(@user)
    if @user.id != nil
      ue = @user.user_extensions ||= UserExtensions.new
      ue.user_id = @user.id
      ue.save
    end
    @user
  end

  #显示用户
  #id用户id
  def show_user(params)
    @user = User.find(params[:id])
    img_url = url_to_avatar(@user)
    gender = @user.user_extensions.gender.nil? ? 0 : @user.user_extensions.gender
    work_unit = get_user_work_unit @user
    location = get_user_location @user
    {:id => @user.id, :img_url => img_url,:realname => @user.realname, :nickname => @user.login, :gender => gender, :work_unit => work_unit, :mail => @user.mail, :location => location, :brief_introduction => @user.user_extensions.brief_introduction}
  end

  #忘记密码
  def lost_password params
    user = ::User.find_by_mail(params[:mail].to_s)
    # user not found or not active
    unless user && user.active?
      raise l(:notice_account_unknown_email,:locale => 'zh')
    end
    # user cannot change its password
    unless user.change_password_allowed?
      raise l(:notice_can_t_change_password,:locale => user.language)
      return
    end
    # create a new token for password recovery
    token = Token.new(:user => user, :action => "recovery")
    if token.save
      Mailer.run.lost_password(token)
      return l(:notice_account_lost_email_sent,:locale => user.language)
    end
  end

  #编辑用户
  #gender 1:female 0:male 其他:male
  def edit_user params
    @user = User.find(params[:id])
    fileio = params[:file]

    @se = @user.extensions
    if @user.user_extensions.identity == 0 || @user.user_extensions.identity == 1
      @se.school_id = params[:occupation]
    elsif @user.user_extensions.identity == 3
      @se.occupation = params[:occupation]
    elsif @user.user_extensions.identity == 2
      @user.firstname = params[:occupation]
    end
    @se.brief_introduction = params[:brief_introduction]
    @se.gender = params[:gender]
    @se.location = params[:province] if params[:province]
    @se.location_city = params[:city] if params[:city]
    raise @se.errors.full_message unless @se.save
    unless  fileio.nil?
      file = fileio[:tempfile]
      diskfile=disk_filename(@user.class.to_s, @user.id)
      @image_file = fileio[:name]
      @urlfile='/' << File.join("images", "avatars", avatar_directory(@user.class.to_s), avatar_filename(@user.id, @image_file))

      path = File.dirname(diskfile)
      unless File.directory?(path)
        FileUtils.mkdir_p(path)
      end
      File.rename(file.path, @urlfile)
      begin
        f = Magick::ImageList.new(diskfile)
        # gif格式不再做大小处理
        if f.format != 'GIF'
          width = 300.0
          proportion = (width/f[0].columns)
          height = (f[0].rows*proportion)
          f.resize_to_fill!(width, height)
          f.write(diskfile)
        end

      rescue Exception => e
        logger.error "[Error] avatar : users_service#edit_user ===> #{e}"
      end
    end
    #img_url = url_to_avatar(@user)
    #gender = @user.user_extensions.gender.nil? ? 0 : @user.user_extensions.gender
    #work_unit = get_user_work_unit @user
    #location = get_user_location @user
    #{:id => @user.id, :img_url => img_url, :nickname => @user.login, :gender => gender, :work_unit => work_unit, :mail => @user.mail, :location => location, :brief_introduction => @user.user_extensions.brief_introduction}
    @user
  end





  #关注列表
  def user_watcher params
    @user = User.find(params[:id])
    User.watched_by(@user.id)
  end

  #用户课程列表
  def user_courses_list params,current_user
    @user = User.find(params[:id])
    if !current_user.admin? && !@user.active?
        raise '404'
        return
    end
    if current_user == @user || current_user.admin?
      membership = @user.coursememberships.all
    else
      membership = @user.coursememberships.all(:conditions => Course.visible_condition(current_user))
    end
    membership.sort! {|older, newer| newer.created_on <=> older.created_on }
    course_list = []
    membership.each do |mp|
      course_list << {:course => mp.course,:img_url => url_to_avatar(mp.course),:current_user_is_member => current_user.member_of_course?(mp.course),:current_user_is_teacher => is_course_teacher(current_user,mp.course)}
    end
    course_list
  end
  
  #修改密码
  def change_password params
    @current_user =  User.find(params[:current_user_id])
    if @current_user.check_password?(params[:password])
      @current_user.password, @current_user.password_confirmation = params[:new_password], params[:new_password_confirmation]
      @current_user.save
        #raise @current_user.errors.full_message
        #return @current_user
    else
      raise l(:notice_account_wrong_password,:locale => 'zh')
    end
    @current_user
  end

  #搜索用户
  def search_user params
    status = params[:status] || 1
    has = {
        "show_changesets" => true
    }
    scope = User.logged.status(status)
    watcher = User.watched_by(params[:user_id])
    watcher.push(params[:user_id])
    search_by = params[:search_by] ? params[:search_by] : "0"
    scope = scope.where("id not in (?)",watcher).like(params[:name],search_by) if params[:name].present?
    scope
  end

end