use std::collections::{HashMap, HashSet};
use crate::models::{Album, Artist, Track};
pub fn extract_comprehensive_metadata(
track: &Track,
album: &Album,
artist: &Artist,
) -> HashMap<String, String> {
let mut metadata = HashMap::new();
if let Some(ref title) = track.title {
metadata.insert("TITLE".to_string(), title.clone());
}
if let Some(ref album_title) = album.title {
metadata.insert("ALBUM".to_string(), album_title.clone());
}
if let Some(ref artist_name) = artist.name {
metadata.insert("ARTIST".to_string(), artist_name.clone());
}
if let Some(ref performers) = track.performers {
metadata.insert("PERFORMER".to_string(), performers.clone());
}
let mut composers = Vec::new();
let mut composer_set = HashSet::new();
if let Some(ref performer) = track.performer
&& let Some(ref performer_name) = performer.name
&& !composer_set.contains(performer_name)
&& performer_name != "Various Composers"
{
composers.push(performer_name.clone());
composer_set.insert(performer_name.clone());
}
if let Some(ref track_composer) = track.composer
&& let Some(ref composer_name) = track_composer.name
&& !composer_set.contains(composer_name)
&& composer_name != "Various Composers"
{
composers.push(composer_name.clone());
composer_set.insert(composer_name.clone());
}
if let Some(ref album_composer) = album.composer
&& let Some(ref composer_name) = album_composer.name
&& !composer_set.contains(composer_name)
&& composer_name != "Various Composers"
{
composers.push(composer_name.clone());
composer_set.insert(composer_name.clone());
}
if !composers.is_empty() {
let combined_composers = composers.join("/");
metadata.insert("COMPOSER".to_string(), combined_composers);
}
if let Some(ref album_label) = album.label
&& let Some(ref label_name) = album_label.name
{
metadata.insert("LABEL".to_string(), label_name.clone());
}
if let Some(ref genre) = album.genre
&& let Some(ref genre_name) = genre.name
{
metadata.insert("GENRE".to_string(), genre_name.clone());
}
if let Some(track_number) = track.track_number {
metadata.insert("TRACKNUMBER".to_string(), track_number.to_string());
}
if let Some(ref album_tracks_count) = album.tracks_count {
metadata.insert("TRACKTOTAL".to_string(), album_tracks_count.to_string());
}
if let Some(ref album_media_count) = album.media_count {
metadata.insert("DISCNUMBER".to_string(), album_media_count.to_string());
}
if let Some(ref copyright) = track.copyright {
metadata.insert("COPYRIGHT".to_string(), copyright.clone());
}
if let Some(ref isrc) = track.isrc {
metadata.insert("ISRC".to_string(), isrc.clone());
}
if let Some(ref release_date) = track.release_date_original {
metadata.insert("DATE".to_string(), release_date.clone());
}
if let Some(ref release_date_stream) = album.release_date_stream {
metadata.insert(
"RELEASE_DATE_STREAM".to_string(),
release_date_stream.clone(),
);
}
if let Some(ref release_date_download) = album.release_date_download {
metadata.insert(
"RELEASE_DATE_DOWNLOAD".to_string(),
release_date_download.clone(),
);
}
if let Some(ref album_subtitle) = album.subtitle {
metadata.insert("SUBTITLE".to_string(), album_subtitle.clone());
}
if let Some(ref album_version) = album.version {
metadata.insert("VERSION".to_string(), album_version.clone());
}
if let Some(ref album_upc) = album.upc {
metadata.insert("UPC".to_string(), album_upc.clone());
}
if let Some(ref album_description) = album.description {
metadata.insert("DESCRIPTION".to_string(), album_description.clone());
}
if let Some(bit_depth) = track.maximum_bit_depth {
metadata.insert("BIT_DEPTH".to_string(), bit_depth.to_string());
}
if let Some(sampling_rate) = track.maximum_sampling_rate {
metadata.insert("SAMPLING_RATE".to_string(), sampling_rate.to_string());
}
if let Some(channel_count) = track.maximum_channel_count {
metadata.insert("CHANNELS".to_string(), channel_count.to_string());
}
if let Some(hires) = track.hires {
metadata.insert("HIRES".to_string(), hires.to_string());
}
if let Some(hires_streamable) = track.hires_streamable {
metadata.insert("HIRES_STREAMABLE".to_string(), hires_streamable.to_string());
}
metadata
}