class BaseForm
  include ActiveModel::Model
  include AesCryptHelper

  Error                     = Class.new(StandardError)
  EmailError                = Class.new(Error)
  LoginError                = Class.new(Error)
  PhoneError                = Class.new(Error)
  PasswordFormatError       = Class.new(Error)
  VerifiCodeError           = Class.new(Error)
  PasswordConfirmationError = Class.new(Error)

  def check_project_category(project_category_id)
    unless project_category_id == ''
      raise "project_category_id参数值无效." if project_category_id && !ProjectCategory.exists?(project_category_id)
    end
  end

  def check_project_language(project_language_id)
    unless project_language_id == ''
      raise "project_language_id参数值无效." if project_language_id && !ProjectLanguage.exists?(project_language_id)
    end
  end

  def check_repository_name(user_id, repository_name)
    check_reversed_keyword(repository_name)
    raise "项目标识已被使用." if Repository.where(user_id: user_id, identifier: repository_name.strip).exists?
  end

  def check_gitea_repository_name(user_id, repository_name)
    user_login = User.find_by_id(user_id)&.login
    begin 
      gitea_result = $gitea_client.get_repos_by_owner_repo(user_login, repository_name)
      raise "项目标识已被使用." if gitea_result["id"].present?
    rescue Gitea::Api::ServerError => e
      raise "服务器错误，请联系系统管理员！" unless e.http_code.to_i == 404
    end
  end

  def check_project_name(user_id, project_name)
    raise "项目名称已被使用." if Project.where(user_id: user_id, name: project_name.strip).exists?
  end

  def check_blockchain_token_all(blockchain_token_all)
    raise "请正确填写项目token总数." if (Float(blockchain_token_all) rescue false) == false or blockchain_token_all.to_i < 0 or Float(blockchain_token_all) != blockchain_token_all.to_i
  end

  def check_blockchain_init_token(blockchain_init_token)
    raise "请正确填写项目创始人token占比." if (Float(blockchain_init_token) rescue false) == false or blockchain_init_token.to_i < 0 or Float(blockchain_init_token) != blockchain_init_token.to_i
  end

  def check_reversed_keyword(repository_name)
    raise "项目标识已被占用." if ReversedKeyword.check_exists?(repository_name)
  end

  def check_password(password)
    password = decrypt(password) rescue password
    password = strip(password)
    raise PasswordFormatError, "密码8~20位密码，支持字母数字和符号" unless password =~ CustomRegexp::PASSWORD
  end

  def check_password_confirmation(password, password_confirmation)
    password = decrypt(password) rescue password
    password_confirmation = decrypt(password_confirmation) rescue password_confirmation

    password = strip(password)
    password_confirmation = strip(password_confirmation)

    raise PasswordFormatError, "确认密码为8~20位密码，支持字母数字和符号" unless password_confirmation =~ CustomRegexp::PASSWORD
    raise PasswordConfirmationError, "两次输入的密码不一致" unless password == password_confirmation
  end

  def check_verifi_code(verifi_code, code)
    code = strip(code)
    return if code == "123123" && EduSetting.get("code_debug") # 万能验证码，用于测试 # TODO 万能验证码，用于测试
    raise VerifiCodeError, "验证码已失效" if !verifi_code&.effective?
    raise VerifiCodeError, "验证码不正确" if verifi_code&.code != code
  end

  private
  def strip(str)
    str.to_s.strip.presence
  end

  # 1 手机类型；0 邮箱类型
  # 注意新版的login是自动名生成的
  def phone_mail_type value
    value =~ /^1\d{10}$/ ? 1 : 0
  end
end
