<?php
define('SIG_DEBUG', is_file(__DIR__ . '/../.debug'));
define('SIG_WIDTH', 400);
define('SIG_HEIGHT', 100);
define('SIG_STATIC', '/tmp/sig-img-1HxTH4MQ.png');
define('SIG_AGE', 60);
define('SIG_FOOTER', __DIR__ . '/ex/footer.png');
define('FW_FONT_FAM', __DIR__ . '/ex/Electrolize-Regular.ttf');
define('FW_FONT_SIZE', 26);
define('FW_TEXT', 'flashwave');
define('FA_FONT_FAM', __DIR__ . '/ex/fa-solid-900.ttf');
define('NP_FONT_FAM', __DIR__ . '/ex/NotoSansJP-Regular.otf');
define('NP_FONT_SIZE', 13);
define('NP_FONT_SIZE_SMALL', 9.5);
define('NP_FONT_SIZE_ICON', 17);
define('NP_FILE', '/tmp/sig-np-NGowpEMJ.json');
define('NP_URL', 'https://now.flash.moe/get.php?u=flashwave_');
define('NP_COVER', '/tmp/sig-cover-h1coc2SW.png');
define('NP_COVER_URL', '/tmp/sig-cover-url-9vXPUgCi.txt');
define('NP_COVER_URL_DEFAULT', 'https://lastfm.freetls.fastly.net/i/u/174s/2a96cbd8b46e442fc41c2b86b821562f.png');
define('NP_COVER_DEFAULT', __DIR__ . '/ex/no-cover.png');
define('NP_COVER_PAD', 5);
define('NP_COVER_FRAME', 1);
define('NP_COVER_RES', SIG_HEIGHT - (NP_COVER_PAD * 2));
define('BG_PATH', __DIR__ . '/bg');
define('BG_IMAGE', 'bg6.png');

$reqMethod = $_SERVER['REQUEST_METHOD'];
$reqPath = '/' . trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');

if($reqMethod !== 'HEAD' && $reqMethod !== 'GET') {
    http_response_code(405);
    header('Allow: GET, HEAD');
    return;
}

if($reqPath === '/np' || $reqPath === '/redir.php') {
    http_response_code(302);
    $np = json_decode(file_get_contents(NP_FILE));

    if(!empty($np[0]->nowplaying) && !empty($np[0]->url))
        header('Location: ' . $np[0]->url);
    else
        header('Location: https://flash.moe');
    return;
}

if($reqPath === '/source' || $reqPath === '/sig-src.php') {
    http_response_code(301);
    header('Location: https://git.flash.moe/flash/signature');
    return;
}

if(in_array($reqPath, [
    '/', '/index.php', '/signature.php', '/signature.png',
    '/album.png', '/album1.png', '/album2.png',
    '/body.png', '/body1.png', '/body2.png',
])) {
    if(!SIG_DEBUG && is_file(SIG_STATIC) && time() - filemtime(SIG_STATIC) < SIG_AGE) {
        header('X-Sig-State: cache');
        $imagick = new Imagick(SIG_STATIC);
    } else {
        header('X-Sig-State: fresh');
        $ip_000 = new ImagickPixel('#000');
        $ip_444 = new ImagickPixel('#444');
        $ip_fff = new ImagickPixel('#fff');

        $npRaw = file_get_contents(NP_URL);
        $np = json_decode($npRaw);

        if(is_array($np)) {
            file_put_contents(NP_FILE, $npRaw);

            if(empty($np[0]->images->large) || $np[0]->images->large === NP_COVER_URL_DEFAULT) {
                unlink(NP_COVER);
                file_put_contents(NP_COVER_URL, '');
            } elseif(!empty($np[0]->images->large) && $np[0]->images->large !== file_get_contents(NP_COVER_URL)) {
                unlink(NP_COVER);
                file_put_contents(NP_COVER_URL, $np[0]->images->large);
                file_put_contents(NP_COVER, file_get_contents($np[0]->images->large));
            }
        }

        if(empty($np))
            $np = json_decode(file_get_contents(NP_FILE));

        $nowPlaying = is_array($np) && !empty($np[0]->nowplaying);

        $imagick = new Imagick;
        $imagick->newImage(SIG_WIDTH, SIG_HEIGHT, $ip_000, 'png');

        $background = new Imagick(BG_PATH . DIRECTORY_SEPARATOR . BG_IMAGE);
        $imagick->compositeImage($background, Imagick::COMPOSITE_COPY, 0, 0);
        $background->destroy();

        $footer = new Imagick(SIG_FOOTER);
        $footerHeight = $footer->getImageHeight() - ($nowPlaying ? 0 : 10);

        $imagick->compositeImage($footer, Imagick::COMPOSITE_MATHEMATICS, 0, SIG_HEIGHT - $footerHeight);
        $footer->destroy();

        $imagickDraw = new ImagickDraw;
        $imagickDraw->setFillColor($ip_444);
        $imagickDraw->setFont(FW_FONT_FAM);
        $imagickDraw->setFontSize(FW_FONT_SIZE);

        $hasCover = $nowPlaying && is_file(NP_COVER);

        if($hasCover) {
            $imagickDraw->rectangle(
                SIG_WIDTH - (NP_COVER_RES + NP_COVER_PAD) - NP_COVER_FRAME,
                NP_COVER_PAD - NP_COVER_FRAME,
                SIG_WIDTH - (NP_COVER_RES + NP_COVER_PAD) + NP_COVER_RES,
                NP_COVER_PAD + NP_COVER_RES,
            );
            $imagick->drawImage($imagickDraw);

            $npCover = new Imagick(NP_COVER);
            $npCover->resizeImage(NP_COVER_RES, NP_COVER_RES, Imagick::FILTER_CATROM, 0.9, true);
            $imagick->compositeImage($npCover, Imagick::COMPOSITE_COPY, SIG_WIDTH - (NP_COVER_RES + NP_COVER_PAD), NP_COVER_PAD);
            $npCover->destroy();
        }

        $imagickDraw->setFillColor(BG_IMAGE === 'bg4.png' ? $ip_000 : $ip_fff);

        $imagickLogo = new Imagick();
        $imagickLogo->newImage($imagick->getImageWidth(), $imagick->getImageHeight(), new ImagickPixel('none'), 'png');
        $imagickLogo->annotateImage(
            $imagickDraw,
            SIG_WIDTH - (4.8 * FW_FONT_SIZE) - ($hasCover ? (NP_COVER_RES + NP_COVER_PAD + NP_COVER_FRAME) : 0),
            SIG_HEIGHT - ($nowPlaying ? 37 : 27),
            0,
            FW_TEXT
        );

        $imagickShadow = clone $imagickLogo;
        $imagickShadow->shadowImage(.8, 5, 0, 0);
        $imagickShadow->compositeImage($imagickLogo, Imagick::COMPOSITE_OVER, 4, 2);
        $imagickLogo->destroy();

        $imagick->compositeImage($imagickShadow, Imagick::COMPOSITE_OVER, -4, -2);
        $imagickShadow->destroy();

        $imagickDraw->setFillColor($ip_fff);

        if($nowPlaying) {
            $imagickDraw->setFont(FA_FONT_FAM);
            $imagickDraw->setFontSize(NP_FONT_SIZE_ICON);
            $imagick->annotateImage($imagickDraw, 8, SIG_HEIGHT - 9, 0, "\u{f001}");

            $imagickDraw->setFont(NP_FONT_FAM);
            $imagickDraw->setFontSize(NP_FONT_SIZE);
            $imagick->annotateImage($imagickDraw, 32, SIG_HEIGHT - 5, 0, $np[0]->name ?? '');

            $imagickDraw->setFontSize(NP_FONT_SIZE_SMALL);
            $imagick->annotateImage($imagickDraw, 32, SIG_HEIGHT - 20, 0, $np[0]->artist->name ?? '');
        } else {
            $imagickDraw->setFont(NP_FONT_FAM);
            $imagickDraw->setFontSize(NP_FONT_SIZE);
            $imagick->annotateImage($imagickDraw, 10, SIG_HEIGHT - 5, 0, "If it ain't broke, I'll break it");
        }

        file_put_contents(SIG_STATIC, $imagick->getImageBlob());
    }

    $fileName = pathinfo($reqPath, PATHINFO_FILENAME);

    switch($fileName) {
        case 'album':
            $imagick->cropImage(SIG_HEIGHT, SIG_HEIGHT, SIG_WIDTH - SIG_HEIGHT, 0);
            break;

        case 'album1':
            $imagick->cropImage(SIG_HEIGHT, SIG_HEIGHT - $footerHeight, SIG_WIDTH - SIG_HEIGHT, 0);
            break;

        case 'album2':
            $imagick->cropImage(SIG_HEIGHT, $footerHeight, SIG_WIDTH - SIG_HEIGHT, SIG_HEIGHT - $footerHeight);
            break;

        case 'body':
            $imagick->cropImage(SIG_WIDTH - SIG_HEIGHT, SIG_HEIGHT, 0, 0);
            break;

        case 'body1':
            $imagick->cropImage(SIG_WIDTH - SIG_HEIGHT, SIG_HEIGHT - $footerHeight, 0, 0);
            break;

        case 'body2':
            $imagick->cropImage(SIG_WIDTH - SIG_HEIGHT, $footerHeight, 0, SIG_HEIGHT - $footerHeight);
            break;

        default:
            $fileName = 'signature';
            break;
    }

    header('Content-Type: image/png');
    header('Cache-Control: max-age=' . SIG_AGE . ', public');
    header('Content-Disposition: inline; filename="' . $fileName . '.png"');
    echo $imagick->getImageBlob();

    $imagick->destroy();
    return;
}

http_response_code(404);
echo '404';
