<?php

namespace Response;

function force_download($filename)
{
    header('Content-Disposition: attachment; filename="'.$filename.'"');
}


function content_type($mimetype)
{
    header('Content-Type: '.$mimetype);
}


function status($status_code)
{
    $sapi_name = php_sapi_name();

    if (strpos($sapi_name, 'apache') !== false || $sapi_name === 'cli-server') {
        header('HTTP/1.0 '.$status_code);
    } else {
        header('Status: '.$status_code);
    }
}


function redirect($url, $status_code = 302)
{
    header('Location: '.$url, true, $status_code);
    exit;
}


function json(array $data, $status_code = 200)
{
    status($status_code);

    header('Content-Type: application/json');
    echo json_encode($data);

    exit;
}


function text($data, $status_code = 200)
{
    status($status_code);

    header('Content-Type: text/plain; charset=utf-8');
    echo $data;

    exit;
}


function html($data, $status_code = 200)
{
    status($status_code);

    header('Content-Type: text/html; charset=utf-8');
    echo $data;

    exit;
}


function xml($data, $status_code = 200)
{
    status($status_code);

    header('Content-Type: text/xml; charset=utf-8');
    echo $data;

    exit;
}


function js($data, $status_code = 200)
{
    status($status_code);

    header('Content-Type: text/javascript; charset=utf-8');
    echo $data;

    exit;
}


function raw($data, $status_code = 200)
{
    status($status_code);
    echo $data;
    exit;
}


function binary($data, $status_code = 200)
{
    status($status_code);

    header('Content-Transfer-Encoding: binary');
    header('Content-Type: application/octet-stream');
    echo $data;

    exit;
}


function csp(array $policies = array())
{
    $policies['default-src'] = "'self'";
    $values = '';

    foreach ($policies as $policy => $hosts) {
        if (is_array($hosts)) {
            $acl = '';

            foreach ($hosts as &$host) {
                if ($host === '*' || $host === "'self'" || strpos($host, 'http') === 0) {
                    $acl .= $host.' ';
                }
            }
        } else {
            $acl = $hosts;
        }

        $values .= $policy.' '.trim($acl).'; ';
    }

    header('Content-Security-Policy: '.$values);
}


function nosniff()
{
    header('X-Content-Type-Options: nosniff');
}


function xss()
{
    header('X-XSS-Protection: 1; mode=block');
}


function hsts()
{
    header('Strict-Transport-Security: max-age=31536000');
}


function xframe($mode = 'DENY', array $urls = array())
{
    header('X-Frame-Options: '.$mode.' '.implode(' ', $urls));
}