<?php

namespace App\Utilities;

use Illuminate\Support\Collection;
use Illuminate\Support\Str;
use Carbon\Carbon;
use App\Models\Page;

class CalendarEvent
{
    public $id;
    public $title;
    public $start_date;
    public $end_date;
    public $description;
    public $link;
    public $color;
    public $page;

    public function __construct($id, $title, Carbon $start_date, Carbon $end_date, $description = null, $link = null, $color = null, $page = null)
    {
        $this->id = $id;
        $this->title = $title;
        $this->start_date = $start_date;
        $this->end_date = $end_date;
        $this->description = $description;
        $this->link = $link;
        $this->color = $color;
        $this->page = $page;
    }

    public static function convertGoogleCalendarEvents(Collection $events, $color = null, $filter = null)
    {
        return $events->map(function ($event) use ($color, $filter) {
            if ($filter) {
                $filter = Str::replace('/', '\/', $filter);
                preg_match('/'.$filter.'/i', $event->summary, $match);
                if (!array_key_exists(0, $match)) {
                    return null;
                }
            }

            $dateStart = ($event->start->getDate() != '') ? Carbon::parse($event->start->getDate(), 'America/Vancouver') : Carbon::parse($event->start->getDateTime());
            $dateEnd = ($event->end->getDate() != '') ? Carbon::parse($event->end->getDate(), 'America/Vancouver') : Carbon::parse($event->end->getDateTime());

            if ($dateEnd->isMidnight()) {
                $dateEnd->subMinute(1);
            }

            $description = self::cleanDescription($event->description);

            $event_page = null;

            //preg_match('/<a.*?href=".*?brentwood.ca\/([^"&]*).*<\/a>/', $description, $match);
            preg_match('/brentwood.ca\/([^"&<. ]*)/', $description, $match);

            if (count($match)) {
                $page = (new Page())->findByFullSlug($match[1]);
                if ($page) {
                    $page->load('version');
                    $page->append(['photo', 'name', 'teaser', 'full_slug', 'photos']);
                    $event_page = $page;
                }
            }

            return new CalendarEvent(
                $event->id,
                $event->summary,
                Carbon::parse($dateStart),
                Carbon::parse($dateEnd),
                $description,
                $event->htmlLink,
                $color,
                $event_page,
            );
        })
        ->filter()
        ->values();
    }

    public static function cleanDescription($description)
    {
        if (!strlen($description)) {
            return null;
        }

        return $description;

        /*
        $raw_description = strip_tags($description, '<p><br><a>');

        if (!strlen($raw_description)) {
            return null;
        }

        $dom = new \DOMDocument();                 // init new DOMDocument
        $dom->loadHTML('<?xml encoding="UTF-8">'.htmlspecialchars($raw_description));           // load the HTML
        $xpath = new \DOMXPath($dom);
        $nodes = $xpath->query('//@*');
        foreach ($nodes as $node) {
            if ($node->nodeName != "src" && $node->nodeName != "href") {
                $node->parentNode->removeAttribute($node->nodeName);
            }
        }

        return trim(strip_tags($dom->saveHTML(), '<p><br><a>'));
         */
    }
}
