<!DOCTYPE html>
<html lang="pl">

<head>
    <meta charset="UTF-8">
    <title>GolbBeltiax</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet">
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/particles.js@2.0.0/particles.min.js"></script>
    <script>
        const adUrls = [
            "https://static.cloudflareinsights.com/beacon.min.js",
            "https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js",
            "https://ssl.google-analytics.com",
            "https://pagead2.googleadservices.com",
            "https://stats.g.doubleclick.net",
            "https://stats.wp.com",
            "https://static.media.net"
        ];

        async function checkAdblock() {
            try {
                for (const url of adUrls) {
                    const response = await fetch(url, {
                        mode: 'no-cors'
                    });

                    if (response.ok) {
                        return true;
                    }
                }
                return false;
            } catch (error) {
                return true;
            }
        }

        async function isFirefox() {
            return navigator.userAgent.includes("Firefox");
        }

        document.addEventListener("DOMContentLoaded", async () => {
            const firefox = await isFirefox();

            const baseStyle = `
      <style>
        body {
          background-color: #333;
          color: #fff;
          font-family: sans-serif;
          display: flex;
          flex-direction: column;
          align-items: center;
          justify-content: center;
          height: 100vh;
          margin: 0;
          text-align: center;
        }

        h1 {
          color: red;
          margin: 20px 0;
        }

        a {
          color: #fff;
          text-decoration: none;
          margin: 10px auto;
          padding: 8px 16px;
          background: #444;
          border-radius: 4px;
        }

        a:hover {
          background: #555;
        }

        img {
          width: 120px;
          height: auto;
        }
      </style>
    `;

            if (!firefox) {
                document.body.innerHTML = `
        ${baseStyle}
        <img src="alert.gif" alt="alert" />
        <h1>Musisz używać Firefoxa!</h1>
        <a href="https://www.mozilla.org/en-US/firefox/new/">Pobierz FireFox</a>
        <a href="https://zen-browser.app/download/">Pobierz Zen Browser (Polecam, używam)</a>
      `;
            } else {
                const isAdblock = await checkAdblock();
                if (!isAdblock) {
                    document.body.innerHTML = `
          ${baseStyle}
          <img src="alert.gif" alt="alert" draggable="false" ondragstart="return false;" />
          <h1>Musisz posiadać AdBlocka!</h1>
          <a href="https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/">Pobierz uBlocka</a>
        `;
                }
            }
        });
    </script>
    </script>
    <style>
        body {
            font-family: 'Roboto', sans-serif;
            background-color: #333;
            color: #f8f9fa;
            padding-top: 70px;
            position: relative;
            overflow-x: hidden;
        }

        #particles-js {
            position: fixed;
            width: 100%;
            height: 100%;
            z-index: -1;
            top: 0;
            left: 0;
        }

        #searchForm {
            max-width: 600px;
            margin: 0 auto;
        }

        #content {
            margin-top: 30px;
        }

        .film,
        .serie {
            margin-bottom: 30px;
        }

        .film img,
        .serie img {
            width: 100%;
            height: auto;
            border-radius: 10px;
            transition: transform 0.3s;
        }

        .film img:hover,
        .serie img:hover {
            transform: scale(1.05);
        }

        .film-details,
        .serie-details {
            padding-left: 20px;
        }

        .film-title a,
        .serie-title a {
            text-decoration: none;
            color: #f8f9fa;
            transition: color 0.3s;
            cursor: pointer;
        }

        .film-title a:hover,
        .serie-title a:hover {
            color: #17a2b8;
        }

        .search-form {
            display: flex;
            align-items: center;
            gap: 10px;
        }

        .search-form input[type="text"] {
            flex: 1;
            padding: 10px;
            font-size: 16px;
            border-radius: 5px;
            border: none;
        }

        .search-form button {
            padding: 10px 20px;
            font-size: 16px;
            cursor: pointer;
            border: none;
            border-radius: 5px;
        }

        #log {
            margin-top: 20px;
            padding: 10px;
            background-color: #444;
            border: 1px solid #555;
            border-radius: 5px;
            height: 150px;
            overflow-y: scroll;
            white-space: pre-wrap;
            font-family: monospace;
        }

        .card {
            background-color: #444;
            border: none;
            transition: transform 0.3s, box-shadow 0.3s;
        }

        .card:hover {
            transform: translateY(-10px);
            box-shadow: 0 10px 20px rgba(0, 0, 0, 0.5);
        }

        .card-title a {
            color: #f8f9fa;
        }

        .card-title a:hover {
            color: #17a2b8;
        }

        h1,
        h2,
        h3 {
            color: #f8f9fa;
        }

        .alert {
            border-radius: 5px;
        }

        #videoPlayerModal .modal-content {
            background-color: #141414;
            border: none;
        }

        #videoPlayerModal .modal-header,
        #videoPlayerModal .modal-footer {
            border: none;
        }

        #videoPlayerModal .btn-close-white {
            filter: invert(1);
        }

        #videoPlayer {
            border: none;
            border-radius: 8px;
            width: 100%;
            height: 100%;
        }

        #recentlyWatched .card {
            background-color: #444;
            border: none;
            transition: transform 0.3s, box-shadow 0.3s;
        }

        #recentlyWatched .card:hover {
            transform: translateY(-5px);
            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
        }

        #recentlyWatched .card-title a {
            color: #f8f9fa;
        }

        #recentlyWatched .card-title a:hover {
            color: #17a2b8;
        }

        .navbar-brand {
            font-weight: bold;
            font-size: 1.5rem;
        }

        .navbar-nav .nav-link {
            color: #f8f9fa !important;
        }

        .navbar-nav .nav-link:hover {
            color: #17a2b8 !important;
        }
    </style>
</head>

<body>
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark fixed-top">
        <div class="container-fluid">
            <a class="navbar-brand" href="http://localhost:3000/">GolbBeltiax</a>
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
                aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse justify-content-end" id="navbarNav">
                <ul class="navbar-nav">
                    <li class="nav-item">
                        <a class="nav-link" href="#" data-bs-toggle="modal" data-bs-target="#loginModal">Logowanie</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#" data-bs-toggle="modal"
                            data-bs-target="#registerModal">Rejestracja</a>
                    </li>
                    <li class="nav-item d-none" id="logoutNav">
                        <a class="nav-link" href="#" id="logoutButton">Wyloguj się</a>
                    </li>
                </ul>
            </div>
        </div>
    </nav>

    <div id="particles-js"></div>

    <div class="container">
        <h1 class="text-center mb-4">GolbBeltiax</h1>

        <form id="searchForm" class="d-flex">
            <input type="text" id="searchInput" class="form-control me-2" placeholder="Wpisz tytuł filmu lub serialu">
        </form>

        <div id="status" class="text-center mt-3"></div>

        <div id="content" class="row">
        </div>
    </div>

    <div class="modal fade" id="playerModal" tabindex="-1" aria-labelledby="playerModalLabel" aria-hidden="true">
        <div class="modal-dialog">
            <div class="modal-content bg-dark text-light">
                <div class="modal-header">
                    <h5 class="modal-title" id="playerModalLabel">Wybierz Odtwarzacz</h5>
                    <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"
                        aria-label="Zamknij"></button>
                </div>
                <div class="modal-body">
                    <ul class="list-group" id="playerOptions">
                    </ul>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Anuluj</button>
                </div>
            </div>
        </div>
    </div>

    <div class="modal fade" id="seasonEpisodeModal" tabindex="-1" aria-labelledby="seasonEpisodeModalLabel"
        aria-hidden="true">
        <div class="modal-dialog modal-dialog-centered">
            <div class="modal-content bg-dark text-light">
                <div class="modal-header">
                    <h5 class="modal-title" id="seasonEpisodeModalLabel">Wybierz Sezon i Odcinek</h5>
                    <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"
                        aria-label="Zamknij"></button>
                </div>
                <div class="modal-body">
                    <div class="mb-3">
                        <label for="seasonSelect" class="form-label">Sezon</label>
                        <select class="form-select" id="seasonSelect">
                            <option selected disabled>Wybierz sezon</option>
                        </select>
                    </div>
                    <div class="mb-3">
                        <label for="episodeSelect" class="form-label">Odcinek</label>
                        <select class="form-select" id="episodeSelect" disabled>
                            <option selected disabled>Najpierw wybierz sezon</option>
                        </select>
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Anuluj</button>
                    <button type="button" class="btn btn-primary" id="confirmEpisodeBtn" disabled>Potwierdź
                        Odcinek</button>
                </div>
            </div>
        </div>
    </div>

    <div class="modal fade" id="loginModal" tabindex="-1" aria-labelledby="loginModalLabel" aria-hidden="true">
        <div class="modal-dialog">
            <div class="modal-content bg-dark text-light">
                <div class="modal-header">
                    <h5 class="modal-title" id="loginModalLabel">Logowanie</h5>
                    <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"
                        aria-label="Zamknij"></button>
                </div>
                <div class="modal-body">
                    <form id="loginForm">
                        <div class="mb-3">
                            <label for="loginUsername" class="form-label">Username</label>
                            <input type="text" class="form-control" id="loginUsername" required>
                        </div>
                        <div class="mb-3">
                            <label for="loginPassword" class="form-label">Hasło</label>
                            <input type="password" class="form-control" id="loginPassword" required>
                        </div>
                        <button type="submit" class="btn btn-primary">Zaloguj się</button>
                    </form>
                    <p class="mt-3">Nie masz konta? <a href="#" data-bs-toggle="modal"
                            data-bs-target="#registerModal">Zarejestruj się</a></p>
                </div>
            </div>
        </div>
    </div>

    <div class="modal fade" id="registerModal" tabindex="-1" aria-labelledby="registerModalLabel" aria-hidden="true">
        <div class="modal-dialog">
            <div class="modal-content bg-dark text-light">
                <div class="modal-header">
                    <h5 class="modal-title" id="registerModalLabel">Rejestracja</h5>
                    <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"
                        aria-label="Zamknij"></button>
                </div>
                <div class="modal-body">
                    <form id="registerForm">
                        <div class="mb-3">
                            <label for="registerUsername" class="form-label">Username</label>
                            <input type="text" class="form-control" id="registerUsername" required>
                        </div>
                        <div class="mb-3">
                            <label for="registerEmail" class="form-label">Email</label>
                            <input type="email" class="form-control" id="registerEmail" required>
                        </div>
                        <div class="mb-3">
                            <label for="registerPassword" class="form-label">Hasło</label>
                            <input type="password" class="form-control" id="registerPassword" required>
                        </div>
                        <button type="submit" class="btn btn-primary">Zarejestruj się</button>
                    </form>
                    <p class="mt-3">Masz już konto? <a href="#" data-bs-toggle="modal"
                            data-bs-target="#loginModal">Zaloguj się</a></p>
                </div>
            </div>
        </div>
    </div>

    <div class="modal fade" id="videoPlayerModal" tabindex="-1" aria-labelledby="videoPlayerModalLabel"
        aria-hidden="true">
        <div class="modal-dialog modal-dialog-centered modal-xl">
            <div class="modal-content bg-dark text-light">
                <div class="modal-header">
                    <h5 class="modal-title" id="videoPlayerModalLabel">Odtwarzacz</h5>
                    <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"
                        aria-label="Zamknij"></button>
                </div>
                <div class="modal-body">
                    <div class="ratio ratio-16x9">
                        <iframe id="videoPlayer" src="" allowfullscreen
                            sandbox="allow-scripts allow-same-origin"></iframe>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script>
        function debounce(func, delay) {
            let debounceTimer;
            return function (...args) {
                const context = this;
                clearTimeout(debounceTimer);
                debounceTimer = setTimeout(() => func.apply(context, args), delay);
            };
        }

        const logDiv = document.getElementById('log');

        function addLog(message) {
            const timestamp = new Date().toLocaleString();
            logDiv.textContent += `[${timestamp}] ${message}\n`;
            logDiv.scrollTop = logDiv.scrollHeight;
            console.log(`[${timestamp}] ${message}`);
        }

        function extractPath(link) {
            try {
                const url = new URL(link, window.location.origin);
                return url.pathname;
            } catch (e) {

                return link.startsWith('/') ? link : `/${link}`;
            }
        }

        let playerStartTime = null;

        function sortQuality(a, b) {
            const qualityOrder = {
                '2160p': 5,
                '1440p': 4,
                '1080p': 3,
                '720p': 2,
                '480p': 1,
                '360p': 0
            };
            return (qualityOrder[b.quality] || 0) - (qualityOrder[a.quality] || 0);
        }

        function groupPlayers(playerLinks) {
            const groups = {};

            playerLinks.forEach(player => {
                const version = player.version || 'Nieznany';
                if (!groups[version]) {
                    groups[version] = [];
                }
                groups[version].push(player);
            });

            const bestPlayers = [];
            for (const version in groups) {
                const sorted = groups[version].sort(sortQuality);
                if (sorted.length > 0) {
                    bestPlayers.push(sorted[0]);
                }
            }

            return bestPlayers;
        }

        async function handleTitleClick(event, itemType, mediaId) {
            event.preventDefault();

            if (itemType === 'film') {
                await handleFilmClick(mediaId);
            } else if (itemType === 'serie') {
                await handleSerieClick(mediaId);
            }
        }

        async function handleFilmClick(mediaId) {
            const statusDiv = document.getElementById('status');

            statusDiv.innerHTML = '<div class="alert alert-info">Pobieranie dostępnych odtwarzaczy...</div>';

            try {
                const response = await fetch('/episode', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify({ path: mediaId })
                });

                const data = await response.json();

                if (response.ok) {
                    let { playerLinks } = data;

                    playerLinks = groupPlayers(playerLinks);

                    if (playerLinks.length === 0) {
                        statusDiv.innerHTML = '<div class="alert alert-warning">Nie znaleziono odpowiednich odtwarzaczy.</div>';
                        return;
                    }

                    const playerOptions = document.getElementById('playerOptions');
                    playerOptions.innerHTML = '';

                    playerLinks.forEach(player => {
                        const listItem = document.createElement('li');
                        listItem.classList.add('list-group-item', 'bg-dark', 'text-light');

                        const playerButton = document.createElement('button');
                        playerButton.classList.add('btn', 'btn-primary', 'w-100', 'text-start', 'd-flex', 'align-items-center');
                        playerButton.innerHTML = `
                            <img src="${player.hostingImage}" alt="${player.hostingName}" style="width: 24px; height: 24px; margin-right: 10px;">
                            ${player.version} | ${player.quality}
                        `;
                        playerButton.onclick = () => {
                            openVideoPlayer(player.link, 'film', mediaId, undefined, undefined);
                            const playerModal = bootstrap.Modal.getInstance(document.getElementById('playerModal'));
                            playerModal.hide();
                        };

                        listItem.appendChild(playerButton);
                        playerOptions.appendChild(listItem);
                    });

                    const playerModal = new bootstrap.Modal(document.getElementById('playerModal'));
                    playerModal.show();

                    playerStartTime = Date.now();

                    statusDiv.innerHTML = `<div class="alert alert-success">Dostępne odtwarzacze zostały pobrane.</div>`;
                } else {
                    statusDiv.innerHTML = `<div class="alert alert-danger">Błąd: ${data.error}</div>`;
                }

            } catch (error) {
                statusDiv.innerHTML = `<div class="alert alert-danger">Wystąpił błąd: ${error.message}</div>`;
            }
        }

        async function handleSerieClick(mediaId) {
            const statusDiv = document.getElementById('status');

            statusDiv.innerHTML = '<div class="alert alert-info">Pobieranie dostępnych sezonów i odcinków...</div>';

            try {
                const response = await fetch('/series', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify({ path: mediaId })
                });
                const data = await response.json();

                if (response.ok) {
                    const { seasons } = data;
                    statusDiv.innerHTML = `<div class="alert alert-success">Znaleziono ${seasons.length} sezonów.</div>`;

                    const seasonSelect = document.getElementById('seasonSelect');
                    const episodeSelect = document.getElementById('episodeSelect');
                    const confirmEpisodeBtn = document.getElementById('confirmEpisodeBtn');

                    seasonSelect.innerHTML = '<option selected disabled>Wybierz sezon</option>';
                    episodeSelect.innerHTML = '<option selected disabled>Najpierw wybierz sezon</option>';
                    episodeSelect.disabled = true;
                    confirmEpisodeBtn.disabled = true;

                    const seasonsData = {};
                    seasons.forEach(season => {
                        seasonsData[season.season] = season.episodes;
                    });

                    seasons.forEach(season => {
                        const option = document.createElement('option');
                        option.value = season.season;
                        option.textContent = `${season.season}`;
                        seasonSelect.appendChild(option);
                    });

                    seasonSelect.onchange = () => {
                        const selectedSeason = seasonSelect.value;
                        const episodes = seasonsData[selectedSeason] || [];

                        episodes.sort((a, b) => a.number - b.number);

                        episodeSelect.innerHTML = '<option selected disabled>Wybierz odcinek</option>';
                        episodes.forEach(ep => {
                            const option = document.createElement('option');
                            option.value = ep.link;
                            option.textContent = `Odcinek ${ep.number} | ${ep.title}`;
                            episodeSelect.appendChild(option);
                        });
                        episodeSelect.disabled = false;
                        confirmEpisodeBtn.disabled = true;
                    };

                    episodeSelect.onchange = () => {
                        confirmEpisodeBtn.disabled = false;
                    };

                    confirmEpisodeBtn.onclick = async () => {
                        const selectedEpisodeLink = episodeSelect.value;
                        const selectedSeason = seasonSelect.value;
                        const selectedEpisodeMatch = episodeSelect.options[episodeSelect.selectedIndex].text.match(/Odcinek (\d+)/i);
                        const selectedEpisode = selectedEpisodeMatch ? selectedEpisodeMatch[1] : 0;
                        const seasonEpisodeModal = bootstrap.Modal.getInstance(document.getElementById('seasonEpisodeModal'));
                        seasonEpisodeModal.hide();
                        await fetchPlayerLinks(selectedEpisodeLink, 'serie', mediaId, selectedSeason, selectedEpisode);
                    };

                    const seasonEpisodeModal = new bootstrap.Modal(document.getElementById('seasonEpisodeModal'));
                    seasonEpisodeModal.show();
                } else {
                    statusDiv.innerHTML = `<div class="alert alert-danger">Błąd: ${data.error}</div>`;
                }

            } catch (error) {
                statusDiv.innerHTML = `<div class="alert alert-danger">Wystąpił błąd: ${error.message}</div>`;
            }
        }

        async function fetchPlayerLinks(mediaId, mediaType, mediaPath, season, episode) {
            const statusDiv = document.getElementById('status');

            statusDiv.innerHTML = '<div class="alert alert-info">Pobieranie dostępnych odtwarzaczy...</div>';

            try {
                const response = await fetch('/episode', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify({ path: mediaId })
                });

                const data = await response.json();

                if (response.ok) {
                    let { playerLinks } = data;

                    playerLinks = groupPlayers(playerLinks);

                    if (playerLinks.length === 0) {
                        statusDiv.innerHTML = '<div class="alert alert-warning">Nie znaleziono odpowiednich odtwarzaczy.</div>';
                        return;
                    }

                    const playerOptions = document.getElementById('playerOptions');
                    playerOptions.innerHTML = '';

                    playerLinks.forEach(player => {
                        const listItem = document.createElement('li');
                        listItem.classList.add('list-group-item', 'bg-dark', 'text-light');

                        const playerButton = document.createElement('button');
                        playerButton.classList.add('btn', 'btn-primary', 'w-100', 'text-start', 'd-flex', 'align-items-center');
                        playerButton.innerHTML = `
                            <img src="${player.hostingImage}" alt="${player.hostingName}" style="width: 24px; height: 24px; margin-right: 10px;">
                            ${player.version} | ${player.quality}
                        `;
                        playerButton.onclick = () => {
                            openVideoPlayer(player.link, mediaType, mediaPath, season, episode);
                            const playerModal = bootstrap.Modal.getInstance(document.getElementById('playerModal'));
                            playerModal.hide();
                        };

                        listItem.appendChild(playerButton);
                        playerOptions.appendChild(listItem);
                    });

                    const playerModal = new bootstrap.Modal(document.getElementById('playerModal'));
                    playerModal.show();

                    playerStartTime = Date.now();

                    statusDiv.innerHTML = `<div class="alert alert-success">Dostępne odtwarzacze zostały pobrane.</div>`;
                } else {
                    statusDiv.innerHTML = `<div class="alert alert-danger">Błąd: ${data.error}</div>`;
                }

            } catch (error) {
                statusDiv.innerHTML = `<div class="alert alert-danger">Wystąpił błąd: ${error.message}</div>`;
            }
        }

        async function handleContinueWatching(mediaType, mediaId, season, episode) {

            try {
                const token = localStorage.getItem('token');
                if (!token) {
                    alert('Musisz się zalogować, aby kontynuować oglądanie.');
                    return;
                }

                let episodeLink = '';
                if (mediaType === 'film') {
                    episodeLink = mediaId;
                } else if (mediaType === 'serie') {

                    episodeLink = `${mediaId}/${season}/${episode}`;
                }

                const response = await fetch('/episode', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                        'Authorization': `Bearer ${token}`
                    },
                    body: JSON.stringify({ path: episodeLink })
                });

                const data = await response.json();

                if (response.ok) {
                    let { playerLinks } = data;
                    playerLinks = groupPlayers(playerLinks);

                    if (playerLinks.length === 0) {
                        alert('Nie znaleziono odtwarzaczy.');
                        return;
                    }

                    const selectedPlayer = playerLinks[0];
                    openVideoPlayer(selectedPlayer.link, mediaType, mediaId, season, episode);
                } else {
                    alert(`Błąd: ${data.error}`);
                }
            } catch (error) {
                alert('Wystąpił błąd podczas próby kontynuacji oglądania.');
            }
        }

        function openVideoPlayer(playerLink, mediaType, mediaPath, season, episode) {
            const videoPlayer = document.getElementById('videoPlayer');
            videoPlayer.src = playerLink;

            videoPlayer.dataset.mediaType = mediaType;
            videoPlayer.dataset.mediaPath = mediaPath;
            videoPlayer.dataset.season = season;
            videoPlayer.dataset.episode = episode;

            const videoPlayerModal = new bootstrap.Modal(document.getElementById('videoPlayerModal'));
            videoPlayerModal.show();

            playerStartTime = Date.now();
        }

        document.getElementById('videoPlayerModal').addEventListener('hidden.bs.modal', () => {
            if (playerStartTime) {
                const watchEndTime = Date.now();
                const watchDuration = Math.floor((watchEndTime - playerStartTime) / 1000);

                const videoPlayer = document.getElementById('videoPlayer');
                const mediaType = videoPlayer.dataset.mediaType;
                const mediaPath = videoPlayer.dataset.mediaPath;
                const season = videoPlayer.dataset.season ? parseInt(videoPlayer.dataset.season, 10) : undefined;
                const episode = videoPlayer.dataset.episode ? parseInt(videoPlayer.dataset.episode, 10) : undefined;

                if (!mediaType || !mediaPath) {
                    return;
                }

                saveWatchProgress(mediaType, mediaPath, season, episode, watchDuration);
                playerStartTime = null;

                videoPlayer.src = "";
            }
        });

        async function saveWatchProgress(mediaType, mediaId, season, episode, watchDuration) {
            try {
                const token = localStorage.getItem('token');
                if (!token) {
                    return;
                }

                const response = await fetch('/watch', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                        'Authorization': `Bearer ${token}`
                    },
                    body: JSON.stringify({
                        mediaType,
                        mediaId,
                        season,
                        episode,
                        lastWatchedTime: watchDuration
                    })
                });

                const data = await response.json();

                if (response.ok) {
                    // Możesz dodać jakieś potwierdzenie lub logowanie
                } else {
                    // Obsługa błędów
                }
            } catch (error) {
                // Obsługa błędów
            }
        }

        function updateNavbar() {
            const token = localStorage.getItem('token');
            const loginNav = document.querySelector('a[data-bs-target="#loginModal"]');
            const registerNav = document.querySelector('a[data-bs-target="#registerModal"]');
            const logoutNav = document.getElementById('logoutNav');

            if (token) {
                loginNav.parentElement.classList.add('d-none');
                registerNav.parentElement.classList.add('d-none');
                logoutNav.classList.remove('d-none');
            } else {
                loginNav.parentElement.classList.remove('d-none');
                registerNav.parentElement.classList.remove('d-none');
                logoutNav.classList.add('d-none');
            }
        }

        document.getElementById('logoutButton').addEventListener('click', () => {
            localStorage.removeItem('token');
            alert('Wylogowano pomyślnie!');
            updateNavbar();
            loadRecentlyWatched();
        });

        document.getElementById('loginForm').addEventListener('submit', async (event) => {
            event.preventDefault();

            const username = document.getElementById('loginUsername').value.trim();
            const password = document.getElementById('loginPassword').value.trim();

            try {
                const response = await fetch('/login', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ username, password })
                });

                const data = await response.json();

                if (response.ok) {
                    localStorage.setItem('token', data.token);
                    alert('Zalogowano pomyślnie!');
                    updateNavbar();
                    bootstrap.Modal.getInstance(document.getElementById('loginModal')).hide();
                    loadRecentlyWatched();
                } else {
                    alert(`Błąd: ${data.error}`);
                }
            } catch (error) {
                alert('Wystąpił błąd podczas logowania.');
            }
        });

        document.getElementById('registerForm').addEventListener('submit', async (event) => {
            event.preventDefault();

            const username = document.getElementById('registerUsername').value.trim();
            const email = document.getElementById('registerEmail').value.trim();
            const password = document.getElementById('registerPassword').value.trim();

            try {
                const response = await fetch('/register', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ username, email, password })
                });

                const data = await response.json();

                if (response.ok) {
                    localStorage.setItem('token', data.token);
                    alert('Zarejestrowano i zalogowano pomyślnie!');
                    updateNavbar();
                    bootstrap.Modal.getInstance(document.getElementById('registerModal')).hide();
                    loadRecentlyWatched();
                } else {
                    alert(`Błąd: ${data.error}`);
                }
            } catch (error) {
                alert('Wystąpił błąd podczas rejestracji.');
            }
        });

        async function fetchMediaDetails(mediaType, mediaId) {
            try {
                const response = await fetch('/details', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify({ path: mediaId })
                });

                const data = await response.json();

                if (response.ok) {
                    return {
                        title: data.title,
                        image: data.image,
                        link: mediaId
                    };
                } else {
                    throw new Error(data.error);
                }
            } catch (error) {
                throw error;
            }
        }

        async function loadRecentlyWatched() {
            const recentlyWatchedDiv = document.getElementById('recentlyWatched');
            recentlyWatchedDiv.innerHTML = '';

            try {
                const token = localStorage.getItem('token');
                if (!token) {
                    recentlyWatchedDiv.innerHTML = '<p>Musisz się zalogować, aby zobaczyć ostatnio oglądane.</p>';
                    return;
                }

                const response = await fetch('/watch', {
                    method: 'GET',
                    headers: {
                        'Authorization': `Bearer ${token}`
                    }
                });

                const data = await response.json();

                if (response.ok) {
                    if (data.watchHistories.length === 0) {
                        recentlyWatchedDiv.innerHTML = '<p>Brak ostatnio oglądanych pozycji.</p>';
                        return;
                    }

                    data.watchHistories.forEach(history => {

                        const card = document.createElement('div');
                        card.classList.add('col-md-3');

                        fetchMediaDetails(history.mediaType, history.mediaId).then(media => {
                            card.innerHTML = `
                                <div class="card h-100">
                                    <img src="${media.image}" class="card-img-top" alt="${media.title}">
                                    <div class="card-body d-flex flex-column">
                                        <h5 class="card-title">
                                            <a href="#" onclick="handleContinueWatching('${history.mediaType}', '${history.mediaId}', ${history.season || 0}, ${history.episode || 0})">
                                                ${media.title}
                                            </a>
                                        </h5>
                                        <p class="card-text"><strong>Czas ostatniego oglądania:</strong> ${formatTime(history.lastWatchedTime)}</p>
                                        <button class="btn btn-primary mt-auto" onclick="handleContinueWatching('${history.mediaType}', '${history.mediaId}', ${history.season || 0}, ${history.episode || 0})">
                                            Oglądaj dalej
                                        </button>
                                    </div>
                                </div>
                            `;
                            recentlyWatchedDiv.appendChild(card);
                        }).catch(error => {
                            card.innerHTML = `<p>Błąd podczas ładowania szczegółów media.</p>`;
                            recentlyWatchedDiv.appendChild(card);
                        });
                    });
                } else {
                    recentlyWatchedDiv.innerHTML = `<p>Błąd: ${data.error}</p>`;
                }
            } catch (error) {
                recentlyWatchedDiv.innerHTML = `<p>Błąd: ${error.message}</p>`;
            }
        }

        function formatTime(seconds) {
            const hrs = Math.floor(seconds / 3600);
            const mins = Math.floor((seconds % 3600) / 60);
            return `${hrs}h ${mins}m`;
        }

        // ZMIANA: Aktualizacja funkcji wyszukiwania na żywo
        const searchInput = document.getElementById('searchInput');
        const statusDiv = document.getElementById('status');
        const contentDiv = document.getElementById('content');

        // Funkcja wyszukiwania
        async function performSearch() {
            const phrase = searchInput.value.trim();

            if (phrase.length === 0) {
                statusDiv.innerHTML = '';
                contentDiv.innerHTML = '';
                return;
            }

            statusDiv.innerHTML = '<div class="alert alert-info">Wyszukiwanie...</div>';

            try {
                const response = await fetch('/fetch', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify({ phrase })
                });

                const data = await response.json();

                if (response.ok) {
                    const { films, series } = data;
                    contentDiv.innerHTML = '';

                    if (films.length > 0) {
                        const filmsDiv = document.createElement('div');
                        filmsDiv.classList.add('row');
                        films.forEach(film => {
                            const col = document.createElement('div');
                            col.classList.add('col-md-3');
                            col.innerHTML = `
                                <div class="card h-100">
                                    <img src="${film.image}" class="card-img-top" alt="${film.title}">
                                    <div class="card-body d-flex flex-column">
                                        <h5 class="card-title film-title"><a href="#" onclick="handleTitleClick(event, 'film', '${film.link}')">${film.title} (${film.year})</a></h5>
                                        <p class="card-text">${film.description}</p>
                                    </div>
                                </div>
                            `;
                            filmsDiv.appendChild(col);
                        });
                        contentDiv.appendChild(filmsDiv);
                    }

                    if (series.length > 0) {
                        const seriesDiv = document.createElement('div');
                        seriesDiv.classList.add('row', 'mt-4');
                        series.forEach(serie => {
                            const col = document.createElement('div');
                            col.classList.add('col-md-3');
                            col.innerHTML = `
                                <div class="card h-100">
                                    <img src="${serie.image}" class="card-img-top" alt="${serie.title}">
                                    <div class="card-body d-flex flex-column">
                                        <h5 class="card-title serie-title"><a href="#" onclick="handleTitleClick(event, 'serie', '${serie.link}')">${serie.title}</a></h5>
                                        <p class="card-text">${serie.description}</p>
                                    </div>
                                </div>
                            `;
                            seriesDiv.appendChild(col);
                        });
                        contentDiv.appendChild(seriesDiv);
                    }

                    statusDiv.innerHTML = `<div class="alert alert-success">Wyszukiwanie zakończone sukcesem.</div>`;
                } else {
                    statusDiv.innerHTML = `<div class="alert alert-danger">Błąd: ${data.error}</div>`;
                }

            } catch (error) {
                statusDiv.innerHTML = `<div class="alert alert-danger">Wystąpił błąd: ${error.message}</div>`;
            }
        }

        searchInput.addEventListener('input', debounce(performSearch, 50));

    </script>

    <script>
        particlesJS('particles-js',
            {
                "particles": {
                    "number": {
                        "value": 80,
                        "density": {
                            "enable": true,
                            "value_area": 800
                        }
                    },
                    "color": {
                        "value": "#ffffff"
                    },
                    "shape": {
                        "type": "circle"
                    },
                    "opacity": {
                        "value": 0.5,
                        "random": false
                    },
                    "size": {
                        "value": 3,
                        "random": true
                    },
                    "line_linked": {
                        "enable": true,
                        "distance": 150,
                        "color": "#ffffff",
                        "opacity": 0.4,
                        "width": 1
                    },
                    "move": {
                        "enable": true,
                        "speed": 6,
                        "direction": "none",
                        "random": false,
                        "straight": false,
                        "out_mode": "out",
                        "bounce": false
                    }
                },
                "interactivity": {
                    "detect_on": "canvas",
                    "events": {
                        "onhover": {
                            "enable": true,
                            "mode": "repulse"
                        },
                        "onclick": {
                            "enable": true,
                            "mode": "push"
                        },
                        "resize": true
                    },
                    "modes": {
                        "grab": {
                            "distance": 400,
                            "line_linked": {
                                "opacity": 1
                            }
                        },
                        "bubble": {
                            "distance": 400,
                            "size": 40,
                            "duration": 2,
                            "opacity": 8,
                            "speed": 3
                        },
                        "repulse": {
                            "distance": 200
                        },
                        "push": {
                            "particles_nb": 4
                        },
                        "remove": {
                            "particles_nb": 2
                        }
                    }
                },
                "retina_detect": true
            }
        );
    </script>
</body>

</html>