class Users::ApplyTrailService < ApplicationService
  Error = Class.new(StandardError)

  attr_reader :user, :remote_ip, :params

  def initialize(user, params)
    @user      = user
    @remote_ip = params.delete(:remote_ip)
    @params    = params
  end

  def call
    Users::ApplyTrailForm.new(params.merge(user: user)).validate!

    ActiveRecord::Base.transaction do
      bind_user_phone! unless user.phone_binded?

      apply = ApplyAction.find_or_initialize_by(user_id: user.id, container_type: 'TrialAuthorization', status: 0)
      apply.assign_attributes(ip_addr: remote_ip, apply_reason: params[:reason]) if apply.new_record?

      # 自动授权
      if auto_authorization_school_student?
        user.update!(certification: 1)

        apply.status = 1
      else
        send_trial_apply_notify!
      end
      apply.save!
    end

    user
  end

  private

  def bind_user_phone!
    code = VerificationCode.where(phone: params[:phone], code: params[:code], code_type: 4).last

    raise Error, '无效的验证码' if code.blank? || !code.effective?

    user.update!(phone: params[:phone])
  end

  def auto_authorization_school_student?
    user.user_extension&.student? && School.exists?(auto_users_trial: true, id: user.user_extension&.school_id)
  end

  def send_trial_apply_notify!
    Educoder::Sms.notify_admin(send_type:'user_apply_auth')
  rescue => ex
    Rails.logger.error('发送通知管理员短信失败')
    Rails.logger.error(ex.message)
    ex.backtrace.each { |msg| Rails.logger.error(msg) }
  end
end