def new_recaptcha_valid?
  return session[:captcha_valid] = true if ENV['RACK_ENV'] == 'test'
  resp = Net::HTTP.get URI(
    'https://www.google.com/recaptcha/api/siteverify?'+
    Rack::Utils.build_query(
      secret: $config['recaptcha_private_key'],
      response: params[:'g-recaptcha-response']
    )
  )

  if JSON.parse(resp)['success'] == true
    session[:captcha_valid] = true
    true
  else
    false
  end
end

post '/create_validate_all' do
  content_type :json
  fields = params.select {|p| p.match /^username$|^password$|^email$|^new_tags_string$/}

  site = Site.new fields

  if site.valid?
    return [].to_json if new_recaptcha_valid?
    return [['captcha', 'Please complete the captcha.']].to_json
  end

  site.errors.collect {|e| [e.first, e.last.first]}.to_json
end

post '/create_validate' do
  content_type :json

  if !params[:field].match /^username$|^password$|^email$|^new_tags_string$/
    return {error: 'not a valid field'}.to_json
  end  

  site = Site.new(params[:field] => params[:value])
  site.valid?

  field_sym = params[:field].to_sym

  if site.errors[field_sym]
    return {error: site.errors[field_sym].first}.to_json
  end

  {result: 'ok'}.to_json
end

post '/create' do
  content_type :json
  require_unbanned_ip
  dashboard_if_signed_in

  @site = Site.new(
    username: params[:username],
    password: params[:password],
    email: params[:email],
    new_tags_string: params[:tags],
    ip: request.ip
  )

  if session[:captcha_valid] != true
    flash[:error] = 'The captcha was not valid, please try again.'
    return {result: 'error'}.to_json
  end

  if !@site.valid? || Site.ip_create_limit?(request.ip)
    flash[:error] = 'There was an unknown error, please try again.'
    return {result: 'error'}.to_json
  end

  @site.save

  session[:captcha_valid] = nil

  EmailWorker.perform_async({
    from: 'web@neocities.org',
    reply_to: 'contact@neocities.org',
    to: @site.email,
    subject: "[Neocities] Welcome to Neocities!",
    body: Tilt.new('./views/templates/email_welcome.erb', pretty: true).render(self)
  })

  send_confirmation_email @site

  session[:id] = @site.id
  {result: 'ok'}.to_json
end