<?php
/** @license MIT
 * Copyright 2017 J. King, Dustin Wilson et al.
 * See LICENSE and AUTHORS files for details */

declare(strict_types=1);
namespace JKingWeb\Arsse\REST;

use JKingWeb\Arsse\Arsse;

class Response {
    const T_JSON = "application/json";
    const T_XML  = "application/xml";
    const T_TEXT = "text/plain";

    public $head = false;
    public $code;
    public $payload;
    public $type;
    public $fields;


    public function __construct(int $code, $payload = null, string $type = self::T_JSON, array $extraFields = []) {
        $this->code    = $code;
        $this->payload = $payload;
        $this->type    = $type;
        $this->fields  = $extraFields;
    }

    public function output() {
        if (!headers_sent()) {
            foreach ($this->fields as $field) {
                header($field);
            }
            $body = "";
            if (!is_null($this->payload)) {
                switch ($this->type) {
                    case self::T_JSON:
                        $body = (string) json_encode($this->payload, \JSON_PRETTY_PRINT);
                        break;
                    default:
                        $body = (string) $this->payload;
                        break;
                }
            }
            if (strlen($body)) {
                header("Content-Type: ".$this->type);
                header("Content-Length: ".strlen($body));
            } elseif ($this->code==200) {
                $this->code = 204;
            }
            try {
                $statusText = Arsse::$lang->msg("HTTP.Status.".$this->code);
            } catch (\JKingWeb\Arsse\Lang\Exception $e) {
                $statusText = "";
            }
            header("Status: ".$this->code." ".$statusText);
            if (!$this->head) {
                echo $body;
            }
        } else {
            throw new REST\Exception("headersSent");
        }
    }
}