import * as signalR from "@microsoft/signalr";
import * as Vue from "vue";
import { TrackAudioFeatures, PlayCount, CurrentlyPlayingDTO, CountSample } from "./HubInterfaces";
import NowPlayingCard from "./Now/NowPlayingCard";
import { AudioFeatureCard, AudioFeatureChartCard, PopularityCard, SpotifyLogoLink } from "./Now/Spotify";
import { PlayCountChartCard, CombinedPlayCountChartCard } from "./Now/PlayCountGraph";
import { ArtistBreakdownChartCard } from "./Now/ArtistBreakdownGraph";
import { PlayCountCard, LastFmLogoLink } from "./Now/LastFm";
import BaseInfoCard from "./Now/BaseInfoCard";

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/nowhub")
    .withAutomaticReconnect()
    .build();

connection.start()
.then(val => {
    connection.invoke("OnConnected");
})
.catch(err => console.error(err));

interface InfoCard {
    Content: string
}

interface NowPlaying {
    currentlyPlaying?: CurrentlyPlayingDTO,
    trackFeatures?: TrackAudioFeatures,
    playCount?: PlayCount,
    cards: InfoCard[]
}

export interface ScrobbleDataSeries {
    label: string,
    colour: string,
    data: CountSample[]
}

const app = Vue.createApp({
    data() {
        return {
            currentlyPlaying: undefined,
            trackFeatures: undefined,
            playCount: undefined,
            cards: []
        } as NowPlaying
    },
    computed: {
        lastfmTrack() {
            return {
                name: this.currentlyPlaying.track.name,
                artist: this.currentlyPlaying.track.artists[0].name,
                album: this.currentlyPlaying.track.album.name,
                album_artist: this.currentlyPlaying.track.album.artists[0].name,
            };
        },
        showArtistChart(){
            return this.playCount !== null && this.playCount !== undefined && this.playCount.artistCountData.length > 3;
        },
        showAlbumChart() {
            return this.playCount !== null && this.playCount !== undefined && this.playCount.albumCountData.length > 3;
        },
        showTrackChart(){
            return this.playCount !== null && this.playCount !== undefined && this.playCount.trackCountData.length > 3;
        },
        showArtistBreakdown(){
            return this.playCount !== null && this.playCount !== undefined && this.playCount.artist > 0;
        },
        earliestDate(){
            return this.playCount.artistCountData[0].timeStamp;
        },
        latestDate(){
            return this.playCount.artistCountData.at(-1).timeStamp;
        },
        trackGraphTitle() { return `${this.currentlyPlaying.track.name} 🎵`},
        albumGraphTitle() { return `${this.currentlyPlaying.track.album.name} 💿`},
        artistGraphTitle() { return `${this.currentlyPlaying.track.artists[0].name} 🎤`},
        combinedData(){
            return [
            { 
                label: "artist",
                colour: "#598556",
                data: this.playCount.artistCountData
            }, 
            { 
                label: "album",
                colour: "#a34c77",
                data: this.playCount.albumCountData
            },
            { 
                label: "track",
                colour: "#7a99c2",
                data: this.playCount.trackCountData
            }];
        }
    },
    created() {
        connection.on("OnNewPlaying", (context: CurrentlyPlayingDTO) => 
        {
            console.log(context);
            this.currentlyPlaying = context;
            this.trackFeatures = null;
            this.playCount = null;
            this.cards = [];

            if(context.track !== null && context.track !== undefined)
            {
                if(context.track.id !== null)
                {
                    connection.invoke("SendAudioFeatures", context.track.id);
                }
                connection.invoke("SendPlayCount",
                    context.track.name,
                    context.track.artists[0].name,
                    context.track.album.name,
                    context.track.album.artists[0].name
                );
                connection.invoke("SendFacts",
                    context.track.name,
                    context.track.artists[0].name,
                    context.track.album.name,
                    context.track.album.artists[0].name
                );
            }
        });

        connection.on("OnNewAudioFeature", (feature: TrackAudioFeatures) => 
        {
            console.log(feature);
            this.trackFeatures = feature;
        });

        connection.on("OnNewPlayCount", (count: PlayCount) => {

            console.log(count);
            this.playCount = count;
        });

        connection.on("OnNewCard", (card: InfoCard) => {

            console.log(card);
            this.cards.push(card);
        });
    }
});

app.component("now-playing-card", NowPlayingCard);
app.component("audio-feature-card", AudioFeatureCard);
app.component("audio-feature-chart-card", AudioFeatureChartCard);
app.component("info-card", BaseInfoCard);
app.component("popularity", PopularityCard);
app.component("spotify-logo", SpotifyLogoLink);
app.component("lastfm-logo", LastFmLogoLink);
app.component("play-count-card", PlayCountCard);
app.component("play-count-chart-card", PlayCountChartCard);
app.component("play-count-chart-card-comb", CombinedPlayCountChartCard);
app.component("artist-breakdown", ArtistBreakdownChartCard);
const vm = app.mount('#app');