"""
$description Indonesian & international live TV channels and video on-demand service. OTT service from Vidio.
$url vidio.com
$type live, vod
$metadata id
$metadata title
"""

import re
from uuid import uuid4

from streamlink.logger import getLogger
from streamlink.plugin import Plugin, pluginmatcher
from streamlink.plugin.api import validate
from streamlink.stream.dash import DASHStream
from streamlink.stream.hls import HLSStream


log = getLogger(__name__)


@pluginmatcher(
    re.compile(r"https?://(?:www\.)?vidio\.com/.+"),
)
class Vidio(Plugin):
    tokens_url = "https://www.vidio.com/live/{id}/tokens"

    def _get_stream_token(self, stream_id, stream_type):
        return self.session.http.post(
            self.tokens_url.format(id=stream_id),
            params={"type": stream_type},
            headers={"Referer": self.url},
            cookies={
                "ahoy_visit": str(uuid4()),
                "ahoy_visitor": str(uuid4()),
            },
            schema=validate.Schema(
                validate.parse_json(),
                {
                    "token": str,
                    "hls_url": validate.any("", validate.url()),
                    "dash_url": validate.any("", validate.url()),
                },
                validate.union_get(
                    "token",
                    "hls_url",
                    "dash_url",
                ),
            ),
        )

    def _get_stream_data(self):
        return self.session.http.get(
            self.url,
            schema=validate.Schema(
                validate.parse_html(),
                validate.xml_find(".//*[@data-video-id]"),
                validate.union((
                    validate.get("data-video-id"),
                    validate.get("data-video-title"),
                    validate.all(
                        validate.get("data-video-has-token"),
                        validate.transform(lambda val: val and val != "false"),
                    ),
                    validate.get("data-vjs-clip-hls-url"),
                    validate.get("data-vjs-clip-dash-url"),
                )),
            ),
        )

    def _get_streams(self):
        self.session.http.headers.update({
            "Origin": "https://www.vidio.com/",
            "Referer": self.url,
        })

        self.id, self.title, has_token, hls_url, dash_url = self._get_stream_data()
        log.debug(f"{self.id=} {has_token=}")

        params = {}
        if has_token:
            token, hls_url, dash_url = self._get_stream_token(self.id, "dash")
            log.trace("token=%s", token)
            params.update([param.split("=", 1) for param in (token.split("&") if token else [])])

        if hls_url:
            return HLSStream.parse_variant_playlist(self.session, hls_url, params=params)
        if dash_url:
            return DASHStream.parse_manifest(self.session, dash_url, params=params)


__plugin__ = Vidio
