<?php
require '../spotify/spotify.php';
require '../spotify/lib.php';

if (isset($_GET['logout'])) {
    $_SESSION['accessToken'] = '';
    $_SESSION['refreshToken'] = '';
}

$_SESSION['accessToken'] = isset($_SESSION['accessToken']) ? $_SESSION['accessToken'] : '';
$_SESSION['refreshToken'] = isset($_SESSION['refreshToken']) ? $_SESSION['refreshToken'] : '';

if (!$_SESSION['accessToken']) {
    header('Location: auth.php');
    die();
}

$session = new SpotifyWebAPI\Session($CLIENT_ID, $CLIENT_SECRET, $REDIRECT_URI);

// Use previously requested tokens fetched from session
if ($_SESSION['accessToken']) {
    $session->setAccessToken($_SESSION['accessToken']);
    $session->setRefreshToken($_SESSION['refreshToken']);
} else {
    // Or request a new access token
    $session->refreshAccessToken($_SESSION['refreshToken']);
}

$options = [
  'scope' => $SPOTIFY_REQUIRED_SCOPES,
  'auto_refresh' => true,
];

$api = new SpotifyWebAPI\SpotifyWebAPI($options, $session);

// Save new tokens, they might have been updated
$_SESSION['accessToken'] = $session->getAccessToken();
$_SESSION['refreshToken'] = $session->getRefreshToken();

// ################################################################

$user = $api->me();

$topArtistsCount = 40;
$playlistsCount = 24;

$templateData = [
  'user' => $user,
  'playlists' => [],
  'topArtists' => [],
  'playlist' => null,

  'infos' => [],
  'errors' => [],
];

$generatePlaylistFromPlaylist = isset($_GET['generate-playlist-from-playlist']);
$generatePlaylistFromSelectedTopArtists = isset($_GET['generate-playlist-top-artists']);
$generatePlaylistFromRandomTopArtists = isset($_GET['generate-playlist-random-top-artists']);

if ($generatePlaylistFromPlaylist) {
    $selectedPlaylists = $_GET['selected-playlist'];
    error_log('Will create new playlist with recommendations from playlists: '.join(', ', $selectedPlaylists).'".');
    $recommendedTrackIds = [];

    $shouldFilterByArtists = isset($_GET['check-playlist-filter-artists']);
    error_log('Filter by artists in source playlists: '.($shouldFilterByArtists ? 'yes' : 'no'));

    $generateLongPlaylist = isset($_GET['check-playlist-long-playlist']);
    error_log('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no'));

    $artistsInSourcePlaylists = [];

    foreach ($selectedPlaylists as $selectedPlaylistId) {
        $playlist = $api->getPlaylist($selectedPlaylistId);
        error_log('Will get recommendations from tracks in playlist "'.$playlist->name.'".');
        $playlistTracks = $playlist->tracks->items;
        error_log('Found '.count($playlistTracks).' tracks.');
        foreach ($playlistTracks as $track) {
            $artists = [];
            foreach ($track->track->artists as $artist) {
                $artists[] = $artist->name;
                $artistsInSourcePlaylists[$artist->id] = 1;
            }
            error_log('Track "'.$track->track->name.'" ('.join(', ', $artists).')');

            $recommendations = $api->getRecommendations([
              'seed_tracks' => [$track->track->id],
              'limit' => ($generateLongPlaylist ? 50 : 30)
          ]);
            error_log(' -> Got '.count($recommendations->tracks).' recommendatations.');
            foreach ($recommendations->tracks as $recommendedTrack) {
                $recommendedTrackIds[$recommendedTrack->id] = $recommendedTrack;
            }
        }
    }

    if ($shouldFilterByArtists) {
        $artistsInSourcePlaylists = array_keys($artistsInSourcePlaylists);
        error_log('Filter by artists found in source playlists ('.count($artistsInSourcePlaylists).')');

        $filteredTrackIds = [];
        foreach ($recommendedTrackIds as $trackId => $track) {
            $trackArtistInWantedArtists = false;
            foreach ($track->artists as $trackArtist) {
                if (\in_array($trackArtist->id, $artistsInSourcePlaylists)) {
                    $filteredTrackIds[$track->id] = 1;
                }
            }
        }
        $recommendedTrackIds = $filteredTrackIds;
    }

    $newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds, $generateLongPlaylist ? 100 : 50);
    $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
    $templateData['playlist'] = createDisplayablePlaylist($newPlaylist);

} elseif ($generatePlaylistFromSelectedTopArtists) {

    $selectedArtists = $_GET['selected-artist'];
    error_log('Will create new playlist with filterted recommendations from artists: '.join(', ', $selectedArtists).'".');
    $recommendedTrackIds = [];

    $shouldFilterByArtists = isset($_GET['check-top-artist-filter-artists']);
    error_log('Filter by artists in selection: '.($shouldFilterByArtists ? 'yes' : 'no'));

    $generateLongPlaylist = isset($_GET['check-top-artist-long-playlist']);
    error_log('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no'));

    foreach ($selectedArtists as $selectedArtist) {
        error_log('Get recommendations for artist '.$selectedArtist.'');
        $recommendations = $api->getRecommendations([
            'seed_artists' => $selectedArtist,
            'limit' => 100
        ]);
        error_log(' -> Got '.count($recommendations->tracks).' recommendatations.');

        // Filter by artist if requested, remove duplicates
        foreach ($recommendations->tracks as $recommendedTrack) {
            if ($shouldFilterByArtists) {
                $trackArtistInWantedArtists = false;
                foreach ($recommendedTrack->artists as $trackArtist) {
                    if (\in_array($trackArtist->id, $selectedArtists)) {
                        $recommendedTrackIds[$recommendedTrack->id] = 1;
                    }
                }
            } else {
                $recommendedTrackIds[$recommendedTrack->id] = 1;
            }
        }
    }

    $newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds, $generateLongPlaylist ? 100 : 50);
    $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
    $templateData['playlist'] = createDisplayablePlaylist($newPlaylist);

} elseif ($generatePlaylistFromRandomTopArtists) {

    $countInTopArtists = random_int(4, 6);
    $countInLessTopArtists = random_int(4, 6);
    $limitBetweenTopAndLessTop = $topArtistsCount;
    $selectedArtists = getRandomArtistsFromTopArtists($api, $countInTopArtists, $countInLessTopArtists, $limitBetweenTopAndLessTop);
    error_log('Will create new playlist with filterted recommendations from random artists: '.join(', ', $selectedArtists).'".');
    $recommendedTrackIds = [];

    $shouldFilterByArtists = isset($_GET['check-top-artist-filter-artists']);
    error_log('Filter by artists in selection: '.($shouldFilterByArtists ? 'yes' : 'no'));

    $generateLongPlaylist = isset($_GET['check-top-artist-long-playlist']);
    error_log('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no'));

    foreach ($selectedArtists as $selectedArtist) {
        error_log('Get recommendations for artist '.$selectedArtist.'');
        $recommendations = $api->getRecommendations([
            'seed_artists' => $selectedArtist,
            'limit' => 100
        ]);
        error_log(' -> Got '.count($recommendations->tracks).' recommendatations.');

        // Filter by artist if requested, remove duplicates
        foreach ($recommendations->tracks as $recommendedTrack) {
            if ($shouldFilterByArtists) {
                $trackArtistInWantedArtists = false;
                foreach ($recommendedTrack->artists as $trackArtist) {
                    if (\in_array($trackArtist->id, $selectedArtists)) {
                        $recommendedTrackIds[$recommendedTrack->id] = 1;
                    }
                }
            } else {
                $recommendedTrackIds[$recommendedTrack->id] = 1;
            }
        }
    }

    $newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds, $generateLongPlaylist ? 100 : 50);
    $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
    $templateData['playlist'] = createDisplayablePlaylist($newPlaylist);
} else {
    $templateData['topArtists'] = $api->getMyTop('artists', ['limit' => $topArtistsCount, 'time_range' => 'short_term'])->items;
    $templateData['playlists'] = $api->getUserPlaylists($user->id, ['limit' => $playlistsCount])->items;
}

require '../template.php';