interface trackInterface {id:string, name: string, artist: string, album: string};
interface playlistInterface {id:string, name:string, tracks: string[]};

interface musicInterface {
	tracks: Record<string, trackInterface>,
	playlists: Record<string, playlistInterface>,
	printPlaylists: undefined | (() => void),
	printTracks: undefined | (() => void),
	printPlaylist: undefined | ((playlistId:string) => void),
	addTrackToPlaylist: undefined | ((trackId:string, playlistId:string) => void),
	addTrack: undefined | ((name:string, artist:string, album:string) => void),
	addPlaylist: undefined | ((name:string) => void),
}

const library: musicInterface = {
	tracks: {
		t01: {
			id: "t01",
			name: "Code Monkey",
			artist: "Jonathan Coulton",
			album: "Thing a Week Three"
		},
		t02: {
			id: "t02",
			name: "Model View Controller",
			artist: "James Dempsey",
			album: "WWDC 2003"
		},
		t03: {
			id: "t03",
			name: "Four Thirty-Three",
			artist: "John Cage",
			album: "Woodstock 1952"
		}
	},
	playlists: {
		p01: {
			id: "p01",
			name: "Coding Music",
			tracks: ["t01", "t02"]
		},
		p02: {
			id: "p02",
			name: "Other Playlist",
			tracks: ["t03"]
		}
	},
	printPlaylists: undefined,
	printTracks: undefined,
	printPlaylist: undefined,
	addTrackToPlaylist: undefined,
	addTrack: undefined,
	addPlaylist: undefined
};

/////////////////////////////
// FUNCTIONS TO IMPLEMENT:
/////////////////////////////

// prints a list of all playlists, in the form:
// p01: Coding Music - 2 tracks
// p02: Other Playlist - 1 tracks
const printPlaylists = function(this: musicInterface):void {
	const { playlists } = this;
	const playlistsKeys:string[] = Object.keys(library.playlists);
	playlistsKeys.forEach((id:string) => {
		console.log(`${id}: ${playlists[id].name} - ${playlists[id].tracks.length} tracks`);
	})
}


library.printPlaylists = printPlaylists;
// library.printPlaylists();


// // prints a list of all tracks, using the following format:
// // t01: Code Monkey by Jonathan Coulton (Thing a Week Three)
// // t02: Model View Controller by James Dempsey (WWDC 2003)
// // t03: Four Thirty-Three by John Cage (Woodstock 1952)
const printTracks = function(this:musicInterface):void {
	const { tracks } = this;
	const tracksKeys:string[] = Object.keys(tracks);
	tracksKeys.forEach((item:string) => {
		const { id, name, artist}:trackInterface = library.tracks[item];
		console.log(`${id}: ${name} by ${artist}`);
	})
}

// library.printTracks = printTracks;
// library.printTracks();

// // prints a list of tracks for a given playlist, using the following format:
// // p01: Coding Music - 2 tracks
// // t01: Code Monkey by Jonathan Coulton (Thing a Week Three)
// // t02: Model View Controller by James Dempsey (WWDC 2003)
const printPlaylist = function(this:musicInterface,playlistId:string):void {
	const { playlists } = this;
	console.log(`${playlistId}: ${playlists[playlistId].name} ${playlists[playlistId].tracks.length} - tracks`);
}

library.printPlaylist = printPlaylist
// library.printPlaylist('p01');

// // adds an existing track to an existing playlist
const addTrackToPlaylist = function(this:musicInterface,trackId:string, playlistId:string):void {
	library.playlists[playlistId].tracks.push(trackId);
}

library.addTrackToPlaylist = addTrackToPlaylist;
// library.addTrackToPlaylist('t01', 'p02');
// console.log(library.playlists.p02);

// // generates a unique id
// // (already implemented: use this for addTrack and addPlaylist)
const generateUid = function():string {
  return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
}


// // adds a track to the library
const addTrack = function(this:musicInterface, name:string, artist:string, album:string):void {
	const id:string = `t${generateUid()}`;
	const track: trackInterface = { id, name, artist, album };
	library.tracks[id] = track;
}

library.addTrack = addTrack;
// // library.addTrack('Lose Yourself', 'Eminem', '8 Mile');
// // console.log(library);


// // adds a playlist to the library
const addPlaylist = function(name:string):void {
	const id:string = `p${generateUid()}`;
	const playlist:playlistInterface = {id, name, tracks: []};
	library.playlists[id] = playlist;
}

library.addPlaylist = addPlaylist;
// // addPlaylist('Lofi');
// // console.log(library);

