<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class Entries extends JsonResource
{
    public function __construct($resource)
    {
        $this->resource = $resource;
    }

    public function toArray($request)
    {
        // Default data that we need to return on every block
        $out = [
            'id'       => (int)$this->id,
            'title'    => $this->frontend_title ? $this->frontend_title : $this->title,
            'pageType' => $this->page_type,
            'slug'     => $this->slug,
        ];

        // Specific block data per type
        $out = array_merge($out, $this->_getEntryData());

        return $out;
    }

    private function _getEntryData()
    {
        $out = [];
        switch ($this->page_type) {
            case 'aboutUs':
                $out = $this->_getAboutUsData();
                break;
            case 'technical-record':
                $out = $this->_getTechnicalRecordData();
                break;
            case 'storyTelling':
                $out = $this->_getBlocksData();
                break;
            case 'multimedia':
                $out = $this->_getMultimediaData();
                break;
            case 'termos-e-condicoes':
                $out = $this->_getContent();
                break;
            case 'privacy-policy':
                $out = $this->_getContent();
                break;
            case 'cookies':
                $out = $this->_getContent();
                break;
            case 'gastronomic-week':
                $out = $this->_getGastronomicWeekData();
                break;
            case 'products':
                $out = $this->_getProductsData();
                break;
            case 'mini-documentaries':
                $out = $this->_getMiniDocumentariesData();
                break;
            case 'histories':
                $out = $this->_getHistoriesData();
                break;
        }

        return $out;
    }

    private function _getAboutUsData()
    {
        if ($this->image) {
            $image = getImage($this->image, 'resizeH780');
        } else {
            $image = (object)[];
            $image->url = null;
            $image->alt = null;
        }
        $out = [
            'title'          => $this->frontend_title,
            'image'          => $image,
            'content'        => $this->content,
            'specifications' => $this->specifications,
            'partners'       => new PartnersCollection($this->partners)
        ];

        return $out;
    }

    private function _getGastronomicWeekData()
    {
        if ($this->image) {
            $image = getImage($this->image, 'resizeH780');
        } else {
            $image = (object)[];
            $image->url = null;
            $image->alt = null;
        }
        if ($this->bottomImage) {
            $bottomImage = getImage($this->bottomImage, 'resizeH780');
        } else {
            $bottomImage = (object)[];
            $bottomImage->url = null;
            $bottomImage->alt = null;
        }
        $out = [
            'title'          => $this->frontend_title,
            'image'          => $image,
            'bottomImage'    => $bottomImage,
            'content'        => $this->content
        ];

        return $out;
    }

    private function _getTechnicalRecordData()
    {
        if ($this->image) {
            $image = getImage($this->image, 'resizeH780');
        } else {
            $image = (object)[];
            $image->url = null;
            $image->alt = null;
        }
        $out = [
            'title'   => $this->frontend_title,
            'image'   => $image,
            'content' => $this->content
        ];

        return $out;
    }

    private function _getBlocksData()
    {
        // TODO: Optimization --> $this->blocks->loadMissing([''])
        $out = [
            'description' => $this->description ? $this->description : "",
            'blocks'      => new BlocksCollection($this->blocks),
        ];

        return $out;
    }

    private function _getMultimediaData()
    {
        $out = [
            'videos' => new MediaVideosCollection($this->mediaVideos),
        ];

        return $out;
    }

    private function _getProductsData()
    {
        $out = [
            'description' => $this->description ? $this->description : "",
            'products'    => Products::collection($this->products),
        ];

        return $out;
    }

    private function _getContent()
    {
        $out = [
            "content" => $this->content
        ];

        return $out;
    }

    private function _getMiniDocumentariesData()
    {
        $out = [
            'description' => $this->description ? $this->description : "",
            'miniDocumentaries' => MiniDocumentaries::collection($this->miniDocumentaries),
        ];
        return $out;
    }

    private function _getHistoriesData()
    {
        // Video data
        $videoTitle = $this->video_title ?? '';
        $videoDescription = $this->video_description ?? '';

        // Video link
        $videoLinkData = isset($this->video_link) && is_string($this->video_link) ? json_decode($this->video_link, true) : ($this->video_link ?? []);
        if (is_array($videoLinkData) && isset($videoLinkData['value'])) {
            $videoLinkData = $videoLinkData['value'];
        }

        $videoLink = null;
        if (!empty($videoLinkData['url']) || !empty($videoLinkData['objectId'])) {
            $url = $videoLinkData['url'] ?? '';
            if (!$url && !empty($videoLinkData['objectId'])) {
                $websiteObject = \App\Models\GenericBackoffice\WebsiteObject::find($videoLinkData['objectId']);
                if ($websiteObject) {
                    $url = $websiteObject->uri;
                }
            }
            $videoLink = [
                'label'      => $videoLinkData['label'] ?? '',
                'url'        => $url,
                'isExternal' => (bool) ($videoLinkData['isExternal'] ?? false),
                'objectId'   => $videoLinkData['objectId'] ?? null,
            ];
        }

        // Video thumbnail
        $videoThumbnail = null;
        if ($this->videoThumbnail) {
            $videoThumbnail = getImage($this->videoThumbnail, 'resizeH780');
        }

        // Docs data
        $docsTitle = $this->docs_title ?? '';
        $docsDescription = $this->docs_description ?? '';

        // Docs link
        $docsLinkData = isset($this->docs_link) && is_string($this->docs_link) ? json_decode($this->docs_link, true) : ($this->docs_link ?? []);
        if (is_array($docsLinkData) && isset($docsLinkData['value'])) {
            $docsLinkData = $docsLinkData['value'];
        }

        $docsLink = null;
        if (!empty($docsLinkData['url']) || !empty($docsLinkData['objectId'])) {
            $url = $docsLinkData['url'] ?? '';
            if (!$url && !empty($docsLinkData['objectId'])) {
                $websiteObject = \App\Models\GenericBackoffice\WebsiteObject::find($docsLinkData['objectId']);
                if ($websiteObject) {
                    $url = $websiteObject->uri;
                }
            }
            $docsLink = [
                'label'      => $docsLinkData['label'] ?? '',
                'url'        => $url,
                'isExternal' => (bool) ($docsLinkData['isExternal'] ?? false),
                'objectId'   => $docsLinkData['objectId'] ?? null,
            ];
        }

        // Docs thumbnail
        $docsThumbnail = null;
        if ($this->docsThumbnail) {
            $docsThumbnail = getImage($this->docsThumbnail, 'resizeH780');
        }

        // Webseries data
        $webseriesTitle = $this->webseries_title ?? '';
        $webseriesDescription = $this->webseries_description ?? '';

        // Webseries link
        $webseriesLinkData = isset($this->webseries_link) && is_string($this->webseries_link) ? json_decode($this->webseries_link, true) : ($this->webseries_link ?? []);
        if (is_array($webseriesLinkData) && isset($webseriesLinkData['value'])) {
            $webseriesLinkData = $webseriesLinkData['value'];
        }

        $webseriesLink = null;
        if (!empty($webseriesLinkData['url']) || !empty($webseriesLinkData['objectId'])) {
            $url = $webseriesLinkData['url'] ?? '';
            if (!$url && !empty($webseriesLinkData['objectId'])) {
                $websiteObject = \App\Models\GenericBackoffice\WebsiteObject::find($webseriesLinkData['objectId']);
                if ($websiteObject) {
                    $url = $websiteObject->uri;
                }
            }
            $webseriesLink = [
                'label'      => $webseriesLinkData['label'] ?? '',
                'url'        => $url,
                'isExternal' => (bool) ($webseriesLinkData['isExternal'] ?? false),
                'objectId'   => $webseriesLinkData['objectId'] ?? null,
            ];
        }

        // Webseries thumbnail
        $webseriesThumbnail = null;
        if ($this->webseriesThumbnail) {
            $webseriesThumbnail = getImage($this->webseriesThumbnail, 'resizeH780');
        }

        $links = [];
        for ($i = 1; $i <= 4; $i++) {
            $linkKey = "link_{$i}_link";
            $thumbnailKey = "link{$i}Thumbnail";
            $thumbnailIdKey = "link_{$i}_thumbnail_id";

            // Decode JSON strings to arrays (full() scope joins language table directly)
            $linkData = isset($this->$linkKey) && is_string($this->$linkKey) ? json_decode($this->$linkKey, true) : ($this->$linkKey ?? []);

            // If linkData has the isNullable/value structure, extract the value
            if (is_array($linkData) && isset($linkData['value'])) {
                $linkData = $linkData['value'];
            }

            if (!empty($linkData['url']) || !empty($linkData['objectId']) || $this->$thumbnailIdKey) {
                $thumbnail = null;
                if ($this->$thumbnailKey) {
                    $thumbnail = getImage($this->$thumbnailKey, 'resizeH780');
                }

                $url = $linkData['url'] ?? '';

                // Resolve objectId to URL if present
                if (!empty($linkData['objectId'])) {
                    $websiteObject = \App\Models\GenericBackoffice\WebsiteObject::find($linkData['objectId']);
                    if ($websiteObject) {
                        $url = $websiteObject->uri;
                    }
                }

                $links[] = [
                    'label'      => $linkData['label'] ?? '',
                    'url'        => $url,
                    'isExternal' => (bool) ($linkData['isExternal'] ?? false),
                    'objectId'   => $linkData['objectId'] ?? null,
                    'thumbnail'  => $thumbnail
                ];
            }
        }

        $out = [
            'description'           => $this->description ? $this->description : "",
            'videoTitle'            => $videoTitle,
            'videoDescription'      => $videoDescription,
            'videoLink'             => $videoLink,
            'videoThumbnail'        => $videoThumbnail,
            'docsTitle'             => $docsTitle,
            'docsDescription'       => $docsDescription,
            'docsLink'              => $docsLink,
            'docsThumbnail'         => $docsThumbnail,
            'webseriesTitle'        => $webseriesTitle,
            'webseriesDescription'  => $webseriesDescription,
            'webseriesLink'         => $webseriesLink,
            'webseriesThumbnail'    => $webseriesThumbnail,
            'links'                 => $links,
        ];

        return $out;
    }
}
