<?php
namespace Site\Controller;

use Site\Controller\BlogPost;
use Site\Controller\Mods;
use Site\Lib\Activitypub;

class Fediverse extends BlogPost {
  use Mods;

  /**
   * @param array $params パラメータ配列
   * @return void
   */
  public function apfinger(array $params): void {
    try {
      header('Content-Type: application/jrd+json');
      $ap = new Activitypub();
      echo $ap->getWebfinger();
      exit;
    } catch (\Exception $e) {
      header('Content-Type: text/plain; charset=utf-8');
      echo 'フェディバースの作成に失敗: '.$e->getMessage();
      exit;
    }
  }

  /**
   * @param array $params パラメータ配列
   * @return void
   */
  public function apactor(array $params): void {
    try {
      header('Content-Type: application/activity+json');
      $ap = new Activitypub();
      echo $ap->getActor();
      exit;
    } catch (\Exception $e) {
      header('Content-Type: text/plain; charset=utf-8');
      echo 'フェディバースの作成に失敗: '.$e->getMessage();
      exit;
    }
  }

  /**
   * @param array $params パラメータ配列
   * @return void
   */
  public function apinbox(array $params): void {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
      header('HTTP/1.1 405 Method Not Allowed');
      header('Allow: POST');
      exit;
    }

    $input = file_get_contents('php://input');
    $activity = json_decode($input, true);
    if (!$activity || !isset($activity['type'])) {
      header('HTTP/1.1 400 Bad Request');
      header('Content-Type: application/activity+json');
      echo json_encode(['error' => '不正なアクティビティ']);
      exit;
    }

    logger(\LogType::ActivityPub, "受付に入れた：".json_encode($activity));

    try {
      header('Content-Type: application/activity+json');
      $ap = new Activitypub();
      $ap->postInbox($activity);
      exit;
    } catch (\Exception $e) {
      header('Content-Type: text/plain; charset=utf-8');
      echo 'フェディバースの作成に失敗: '.$e->getMessage();
      exit;
    }
  }

  /**
   * @param array $params パラメータ配列
   * @return void
   */
  public function apactivity(array $params): void {
    $uuid = '';
    if (isset($params['uuid'])) $uuid = $params['uuid'];

    try {
      header('Content-Type: application/activity+json');
      $posts = $this->getPosts('/blog/');
      $ap = new Activitypub($posts);
      echo $ap->getActivity($uuid);
      exit;
    } catch (\Exception $e) {
      header('Content-Type: text/plain; charset=utf-8');
      echo 'フェディバースの作成に失敗: '.$e->getMessage();
      exit;
    }
  }

  /**
   * @param array $params パラメータ配列
   * @return void
   */
  public function apoutbox(array $params): void {
    try {
      header('Content-Type: application/activity+json');
      $posts = $this->getPosts('/blog/');
      $ap = new Activitypub($posts);
      echo $ap->getOutbox();
      exit;
    } catch (\Exception $e) {
      header('Content-Type: text/plain; charset=utf-8');
      echo 'フェディバースの作成に失敗: '.$e->getMessage();
      exit;
    }
  }

  /**
   * @param array $params パラメータ配列
   * @return void
   */
  public function apfollowers(array $params): void {
    try {
      header('Content-Type: application/activity+json');
      $ap = new Activitypub();
      echo $ap->getFollowers();
      exit;
    } catch (\Exception $e) {
      header('Content-Type: text/plain; charset=utf-8');
      echo 'フェディバースの作成に失敗: '.$e->getMessage();
      exit;
    }
  }

  /**
   * @param array $params パラメータ配列
   * @return void
   */
  public function apfollowing(array $params): void {
    try {
      header('Content-Type: application/activity+json');
      $ap = new Activitypub();
      echo $ap->getFollowing();
      exit;
    } catch (\Exception $e) {
      header('Content-Type: text/plain; charset=utf-8');
      echo 'フェディバースの作成に失敗: '.$e->getMessage();
      exit;
    }
  }
}
