<?php

function push_error(&$app, $msg) {
  $app->response()->status(400);
  echo $msg . "\n";
  die();
}

///////////////////////////////////////////////////////////////
// These are just test routes
$app->get('/callback-success', function() use($app) {
  $params = $app->request()->params();
  $app->response()->status(200);
  echo $params['hub_challenge'];
});

$app->get('/callback-fail', function() use($app) {
  $params = $app->request()->params();
  $app->response()->status(404);
});
///////////////////////////////////////////////////////////////


$app->post('/', function() use($app) {
  $params = $app->request()->params();

  switch($mode=k($params, 'hub_mode')) {
    case 'subscribe':
    case 'unsubscribe':

      // Sanity check the request params
      $topic = k($params, 'hub_topic');
      $callback = k($params, 'hub_callback');

      if(!is_valid_push_url($topic)) {
        push_error($app, 'Topic URL was invalid');
      }

      if(!is_valid_push_url($callback)) {
        push_error($app, 'Callback URL was invalid');
      }

      if($mode == 'subscribe') {
        // If we've already seen the topic, assume it's valid and don't check it again
        if(!db\feed_from_url($topic)) {
          $topic_head = request\get_head($topic);
          if($topic_head && !request\response_is($topic_head['status'], 2)) {
            push_error($app, "The topic URL returned a " . $topic_head['status'] . " status code");
          } else {
            push_error($app, 'We tried to verify the topic URL exists but it didn\'t respond to a HEAD request.');
          }
        }

        // Find or create the feed given the topic URL
        $feed = db\find_or_create('feeds', ['feed_url'=>$topic], [
          'hash' => db\random_hash(),
        ], true);

        // Find or create the subscription for this callback URL and feed
        $subscription = db\find_or_create('subscriptions', ['feed_id'=>$feed->id, 'callback_url'=>$callback], [
          'hash' => db\random_hash()
        ], true);
        // Always set a new requested date and challenge
        $subscription->date_requested = db\now();
        $subscription->challenge = db\random_hash();
        $subscription->save();

        // Queue the worker to validate the subscription
        DeferredTask::queue('PushTask', 'verify_subscription', [$subscription->id, 'subscribe']);

      } else {
        $feed = db\feed_from_url($topic);
        if(!$feed) {
          push_error($app, 'The topic was not found, so there is no subscription active');
        }

        $subscription = db\find('subscriptions', ['feed_id'=>$feed->id, 'callback_url'=>$callback]);
        if(!$subscription) {
          push_error($app, 'There was no subscription found for this callback URL and topic');
        }

        // Queue the worker to validate the subscription
        DeferredTask::queue('PushTask', 'verify_subscription', [$subscription->id, 'unsubscribe']);
      }

      $app->response()->status(202);
      echo "The subscription request is being validated. Check the status here:\n";
      echo Config::$base_url . '/subscription/' . $subscription->hash . "\n";

      break;


      break;
  }


});