class Competitions::JoinTeamService < ApplicationService
  Error = Class.new(StandardError)

  attr_reader :competition, :user, :params

  def initialize(competition, user, params)
    @competition = competition
    @user        = user
    @params      = params
  end

  def call
    invite_code = params[:invite_code].to_s.strip
    raise Error, '战队邀请码不能为空' if invite_code.blank?

    raise Error, '本竞赛只面向部分学校/单位开放,你暂时没有参赛资格' unless competition.open?(user)

    is_teacher = user.is_teacher?
    raise Error, '本竞赛的参赛者限定为:学生' if is_teacher && competition.teacher_enroll_forbidden?
    raise Error, '本竞赛的参赛者限定为:教师' if !is_teacher && competition.member_enroll_forbidden?

    team = competition.competition_teams.find_by(invite_code: invite_code)
    raise Error, '战队邀请码无效' if team.blank?
    raise Error, '您已加入该战队' if team.team_members.exists?(user_id: user.id)

    enrolled = competition.team_members.exists?(user_id: user.id)
    if enrolled && ((is_teacher && competition.teacher_multiple_limited?) || (!is_teacher && competition.member_multiple_limited?))
      raise Error, '您已加入其它战队'
    end

    raise Error, '该战队教师人数已满' if is_teacher && team.teachers.count == competition.teacher_staff.maximum
    raise Error, '该战队队员人数已满' if !is_teacher && team.members.count == competition.member_staff.maximum

    role = is_teacher ? 3 : 2
    team.team_members.create!(competition_id: competition.id, user_id: user.id, role: role, is_teacher: is_teacher)
  end
end