<?php

namespace App\Http\Controllers\Gallery;

use App\Album;
use App\Facade\Theme;
use App\Facade\UserConfig;
use App\Helpers\DbHelper;
use App\Http\Controllers\Controller;
use App\Label;
use App\Photo;
use App\VisitorHit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

class DefaultController extends Controller
{
    public function index(Request $request)
    {
        $albums = DbHelper::getAlbumsForCurrentUser(0);

        /** @var Album $album */
        foreach ($albums as $album)
        {
            $album->children_count = DbHelper::getChildAlbumsCount($album);
        }

        $resetStatus = $request->session()->get('status');

        // Record the visit to the index (no album or photo to record a hit against though)
        if (UserConfig::get('enable_visitor_hits'))
        {
            DB::transaction(function () use ($request)
            {
                VisitorHit::fromRequest($request);
            });
        }

        return Theme::render('gallery.index', [
            'albums' => $albums,
            'info' => $request->session()->get('info'),
            'success' => $resetStatus
        ]);
    }

    public function sitemapXml()
    {
        $xml = new \DOMDocument('1.0', 'UTF-8');
        $xml->preserveWhiteSpace = true;
        $xml->formatOutput = true;

        $root = $xml->createElementNS('http://www.sitemaps.org/schemas/sitemap/0.9', 'urlset');
        $root->appendChild($xml->createAttribute('xmlns:image'))
             ->appendChild($xml->createTextNode('http://www.google.com/schemas/sitemap-image/1.1'));
        $xml->appendChild($root);

        // Root URL (get last modified photo to create the lastmod date for this URL)
        $lastModifiedPhoto = Photo::orderBy('updated_at', 'desc')->first();
        $this->createSitemapNode($xml, $root, route('home'), (is_null($lastModifiedPhoto) ? '' : $lastModifiedPhoto->updated_at), '1.0');

        // Albums the current user is allowed to access
        $albumIDs = DbHelper::getAlbumIDsForCurrentUser();

        // Add each label
        $labels = Label::orderBy('name');
        $labels->chunk(100, function($labelsChunk) use ($xml, $root)
        {
            /** @var Label $label */
            foreach ($labelsChunk as $label)
            {
                $lastModifiedPhoto = $label->photos()->orderBy('updated_at', 'desc')->first();
                $this->createSitemapNode($xml, $root, $label->url(), (is_null($lastModifiedPhoto) ? $label->updated_at : $lastModifiedPhoto->updated_at), '0.9');
            }
        });

        // Add each album URL
        $albums = Album::whereIn('id', $albumIDs)->orderBy('name');
        $albums->chunk(100, function($albumsChunk) use ($xml, $root)
        {
            /** @var Album $album */
            foreach ($albumsChunk as $album)
            {
                $lastModifiedPhoto = Photo::where('album_id', $album->id)->orderBy('updated_at', 'desc')->first();
                $this->createSitemapNode($xml, $root, $album->url(), (is_null($lastModifiedPhoto) ? $album->updated_at : $lastModifiedPhoto->updated_at), '0.8');
            }
        });

        // Add each photo URL
        $photos = Photo::whereIn('album_id', $albumIDs)->orderBy('name');
        $photos->chunk(100, function($tempPhotos) use ($xml, $root)
        {
            /** @var Photo $photo */
            foreach ($tempPhotos as $photo)
            {
                $photoMeta = [$photo->name];
                if (strlen($photo->description) > 0)
                {
                    $photoMeta[] = $photo->description;
                }

                $this->createSitemapNode(
                    $xml,
                    $root,
                    $photo->url(),
                    $photo->updated_at,
                    '0.7',
                    $photo->thumbnailUrl('fullsize', false),
                    join(' - ', $photoMeta)
                );
            }
        });

        return response($xml->saveXML(), 200, ['Content-Type' => 'text/xml']);
    }

    private function createSitemapNode(
        \DOMDocument $document,
        \DOMElement $parentElement,
        $url,
        $lastModifiedDate = '',
        $priority = '',
        $imageUrl = '',
        $imageCaption = ''
    )
    {
        $urlElement = $document->createElement('url');

        $urlLocElement = $document->createElement('loc', htmlentities($url));
        $urlElement->appendChild($urlLocElement);

        $changeFreqElement = $document->createElement('changefreq', 'weekly');
        $urlElement->appendChild($changeFreqElement);

        if (strlen($lastModifiedDate) > 0)
        {
            $lastModElement = $document->createElement('lastmod', date('Y-m-d\TH:i:s+00:00', strtotime($lastModifiedDate)));
            $urlElement->appendChild($lastModElement);
        }

        if (strlen($priority) > 0)
        {
            $priorityElement = $document->createElement('priority', $priority);
            $urlElement->appendChild($priorityElement);
        }

        if (strlen($imageUrl) > 0)
        {
            $imageElement = $document->createElement('image:image');

            $imageLocElement = $document->createElement('image:loc', htmlentities($imageUrl));
            $imageElement->appendChild($imageLocElement);

            $imageCaptionElement = $document->createElement('image:caption', htmlentities($imageCaption));
            $imageElement->appendChild($imageCaptionElement);

            $urlElement->appendChild($imageElement);
        }

        $parentElement->appendChild($urlElement);

        return $urlElement;
    }
}