<?php

namespace App\Libs\Services;

use App\Models\GenericBackoffice\BlogArticle;
use App\Models\GenericBackoffice\Entry;
use App\Models\GenericBackoffice\OpenPosition;
use App\Models\GenericBackoffice\Project;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Storage;
use Spatie\Sitemap\SitemapGenerator;
use Spatie\Sitemap\Tags\Url;

class SitemapService
{
    public function generateSitemap()
    {
        $slugFrontend = env('APP_FRONTEND_URL', '');
        $defaultLanguageId = getDefaultLanguage();
        $availableLanguages = getAvailableLanguages();
        $sitemap = SitemapGenerator::create($slugFrontend)->getSitemap();
        $now = Carbon::now()->toDateTime();

        // pages (entries)
        $entries = Entry::full()
                    ->select('*')
                    ->where('status', 'published')
                    ->orderBy('position', 'asc')
                    ->with('websites.languages')
                    ->get();
        foreach ($entries as $page) {
            $url = Url::create($slugFrontend.$page->uri)
                ->setPriority(1)
                ->setChangeFrequency(Url::CHANGE_FREQUENCY_MONTHLY)
                ->setLastModificationDate($now);
            foreach($availableLanguages as $lang => $value) {
                $langUri = $page->websites->first()->languages->findByLocale($lang)->lang_uri;
                $url->addAlternate(lang_uri($langUri, $lang)?: '/', $lang);
            }
            $sitemap->add($url);
        }
        // blog articles
        $articles = BlogArticle::full()
                        ->select('*')
                        ->where('status', 'published')
                        ->orderBy('position', 'asc')
                        ->get();
        foreach ($articles as $article) {
            $url = Url::create($slugFrontend.$article->uri)
                ->setPriority(1)
                ->setChangeFrequency(Url::CHANGE_FREQUENCY_MONTHLY)
                ->setLastModificationDate($now);
            foreach($availableLanguages as $lang => $value) {
                $langUri = $article->websites->first()->languages->findByLocale($lang)->lang_uri;
                $url->addAlternate(lang_uri($langUri, $lang)?: '/', $lang);
            }
            $sitemap->add($url);
        }
        // projects
        $projects = Project::full()
                        ->select('*')
                        ->where('status', 'published')
                        ->orderBy('position', 'asc')
                        ->get();
        foreach ($projects as $project) {
            $url = Url::create($slugFrontend . $project->uri)
                ->setPriority(1)
                ->setChangeFrequency(Url::CHANGE_FREQUENCY_MONTHLY)
                ->setLastModificationDate($now);
            foreach($availableLanguages as $lang => $value) {
                $langUri = $project->websites->first()->languages->findByLocale($lang)->lang_uri;
                $url->addAlternate(lang_uri($langUri, $lang)?: '/', $lang);
            }
            $sitemap->add($url);
        }
        // jobs
        $positions = OpenPosition::full()
            ->select('*')
            ->where('status', 'published')
            ->orderBy('position', 'asc')
            ->get();
        foreach ($positions as $position) {
            $url = Url::create($slugFrontend . $position->uri)
                ->setPriority(1)
                ->setChangeFrequency(Url::CHANGE_FREQUENCY_MONTHLY)
                ->setLastModificationDate($now);
            foreach($availableLanguages as $lang => $value) {
                $langUri = $position->websites->first()->languages->findByLocale($lang)->lang_uri;
                $url->addAlternate(lang_uri($langUri, $lang)?: '/', $lang);
            }
            $sitemap->add($url);
        }
        $sitemap->writeToFile(Storage::path(config('path.internal.sitemap').'/sitemap.xml'));
    }

}
