<?php

$app->get('/micropub/syndications', function() use($app) {
  if($user=require_login($app)) {
    $data = get_micropub_config($user, ['q'=>'config']);
    $app->response()['Content-type'] = 'application/json';
    $app->response()->body(json_encode(array(
      'targets' => $data['targets'],
      'response' => $data['response']
    )));
  }
});

$app->get('/micropub/channels', function() use($app) {
  if($user=require_login($app)) {
    $data = get_micropub_config($user, ['q'=>'config']);
    $app->response()['Content-type'] = 'application/json';
    $app->response()->body(json_encode(array(
      'channels' => $data['channels'],
      'response' => $data['response']
    )));
  }
});

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

    // Remove any blank params
    $params = array_filter($params, function($v){
      return $v !== '';
    });

    $r = micropub_post_for_user($user, $params);

    $app->response()['Content-type'] = 'application/json';
    $app->response()->body(json_encode(array(
      'request' => htmlspecialchars($r['request']),
      'response' => htmlspecialchars($r['response']),
      'location' => (isset($r['location']) && $r['location'] ? Mf2\resolveUrl($user->micropub_endpoint, $r['location']) : null),
      'error' => $r['error'],
      'curlinfo' => $r['curlinfo']
    )));
  }
});

$app->post('/micropub/multipart', function() use($app) {
  if($user=require_login($app)) {
    // var_dump($app->request()->post());
    //
    // Since $app->request()->post() with multipart is always
    // empty (bug in Slim?) We're using the raw $_POST here.
    // PHP empties everything in $_POST if the file upload size exceeds
    // that is why we have to test if the variables exist first.

    $file = isset($_FILES['photo']) ? $_FILES['photo'] : null;

    if($file) {
      $error = validate_photo($file);

      unset($_POST['null']);

      if(!$error) {
        correct_photo_rotation($file['tmp_name']);
        $r = micropub_post_for_user($user, $_POST, $file);
      } else {
        $r = array('error' => $error);
      }
    } else {
      unset($_POST['null']);
      $r = micropub_post_for_user($user, $_POST);
    }

    // Populate the error if there was no location header.
    if(empty($r['location']) && empty($r['error'])) {
      $r['error'] = "No 'Location' header in response.";
    }

    $app->response()['Content-type'] = 'application/json';
    $app->response()->body(json_encode(array(
      'response' => (isset($r['response']) ? htmlspecialchars($r['response']) : null),
      'location' => (isset($r['location']) && $r['location'] ? Mf2\resolveUrl($user->micropub_endpoint, $r['location']) : null),
      'error' => (isset($r['error']) ? $r['error'] : null),
    )));
  }
});

$app->post('/micropub/media', function() use($app) {
  if($user=require_login($app)) {
    $file = isset($_FILES['photo']) ? $_FILES['photo'] : null;
    $error = validate_photo($file);
    unset($_POST['null']);

    if(!$error) {
      correct_photo_rotation($file['tmp_name']);
      $r = micropub_media_post_for_user($user, $file);
    } else {
      $r = array('error' => $error);
    }

    if(empty($r['location']) && empty($r['error'])) {
      $r['error'] = "No 'Location' header in response.";
    }

    $date_created = null;
    $tz_offset = null;
    $latitude = null;
    $longitude = null;

    if(!empty($r['body'])) {
      $body = json_decode($r['body'], true);
      if(!empty($body) && is_array($body) && isset($body['date_created'])) {
        $date_created = $body['date_created'];
        
        if(isset($body['latitude'])) {
          $timezone = p3k\Timezone::timezone_for_location($body['latitude'], $body['longitude']);
          $tz = new DateTimeZone($timezone);
          $tz_offset = tz_seconds_to_offset($tz->getOffset(new DateTime($date_created)));
          $latitude = $body['latitude'];
          $longitude = $body['longitude'];
        }
        
      }
    }

    $app->response()['Content-type'] = 'application/json';
    $app->response()->body(json_encode(array(
      'url' => (isset($r['location']) ? $r['location'] : null),
      'date_created' => $date_created,
      'tz_offset' => $tz_offset,
      'latitude' => $latitude,
      'longitude' => $longitude,
      'error' => (isset($r['error']) ? $r['error'] : null),
      'debug' => $r['body']
    )));
  }
});

$app->post('/micropub/postjson', function() use($app) {
  if($user=require_login($app)) {
    $params = $app->request()->params();

    $r = micropub_post_for_user($user, json_decode($params['data'], true), null, true);

    $app->response()['Content-type'] = 'application/json';
    $app->response()->body(json_encode([
      'location' => (isset($r['location']) && $r['location'] ? Mf2\resolveUrl($user->micropub_endpoint, $r['location']) : null),
      'error' => $r['error'],
      'response' => $r['response']
    ]));
  }
});
