const { TrackFormats } = require('deezer-js')
const { getMusicFolder, getConfigFolder } = require('./utils/localpaths.js')
const fs = require('fs')

// Should the lib overwrite files?
const OverwriteOption = {
  OVERWRITE: 'y', // Yes, overwrite the file
  DONT_OVERWRITE: 'n', // No, don't overwrite the file
  DONT_CHECK_EXT: 'e', // No, and don't check for extensions
  KEEP_BOTH: 'b', // No, and keep both files
  ONLY_TAGS: 't' // Overwrite only the tags
}

// What should I do with featured artists?
const FeaturesOption = {
  NO_CHANGE: "0", // Do nothing
  REMOVE_TITLE: "1", // Remove from track title
  REMOVE_TITLE_ALBUM: "3", // Remove from track title and album title
  MOVE_TITLE: "2" // Move to track title
}

const DEFAULTS = {
  downloadLocation: getMusicFolder(),
  tracknameTemplate: "%artist% - %title%",
  albumTracknameTemplate: "%tracknumber% - %title%",
  playlistTracknameTemplate: "%position% - %artist% - %title%",
  createPlaylistFolder: true,
  playlistNameTemplate: "%playlist%",
  createArtistFolder: false,
  artistNameTemplate: "%artist%",
  createAlbumFolder: true,
  albumNameTemplate: "%artist% - %album%",
  createCDFolder: true,
  createStructurePlaylist: false,
  createSingleFolder: false,
  padTracks: true,
  paddingSize: "0",
  illegalCharacterReplacer: "_",
  queueConcurrency: 3,
  maxBitrate: String(TrackFormats.MP3_320),
  fallbackBitrate: true,
  fallbackSearch: false,
  logErrors: true,
  logSearched: false,
  saveDownloadQueue: false,
  overwriteFile: OverwriteOption.DONT_OVERWRITE,
  createM3U8File: false,
  playlistFilenameTemplate: "playlist",
  syncedLyrics: false,
  embeddedArtworkSize: 800,
  embeddedArtworkPNG: false,
  localArtworkSize: 1200,
  localArtworkFormat: "jpg",
  saveArtwork: true,
  coverImageTemplate: "cover",
  saveArtworkArtist: false,
  artistImageTemplate: "folder",
  jpegImageQuality: 80,
  dateFormat: "Y-M-D",
  albumVariousArtists: true,
  removeAlbumVersion: false,
  removeDuplicateArtists: false,
  tagsLanguage: "",
  featuredToTitle: FeaturesOption.NO_CHANGE,
  titleCasing: "nothing",
  artistCasing: "nothing",
  executeCommand: "",
  tags: {
    title: true,
    artist: true,
    album: true,
    cover: true,
    trackNumber: true,
    trackTotal: false,
    discNumber: true,
    discTotal: false,
    albumArtist: true,
    genre: true,
    year: true,
    date: true,
    explicit: false,
    isrc: true,
    length: true,
    barcode: true,
    bpm: true,
    replayGain: false,
    label: true,
    lyrics: false,
    syncedLyrics: false,
    copyright: false,
    composer: false,
    involvedPeople: false,
    source: false,
    savePlaylistAsCompilation: false,
    useNullSeparator: false,
    saveID3v1: true,
    multiArtistSeparator: "default",
    singleAlbumArtist: false,
    coverDescriptionUTF8: false
  }
}

function save(settings, configFolder){
  configFolder = configFolder || getConfigFolder()
  if (!fs.existsSync(configFolder)) fs.mkdirSync(configFolder)

  fs.writeFileSync(configFolder+'config.json', JSON.stringify(settings, null, 2))
}

function load(configFolder){
  configFolder = configFolder || getConfigFolder()
  if (!fs.existsSync(configFolder)) fs.mkdirSync(configFolder)

  if (! fs.existsSync(configFolder+'config.json')) save(DEFAULTS, configFolder)

  let settings = JSON.parse(fs.readFileSync(configFolder+'config.json'))
  if (check(settings) > 0) save(settings, configFolder)
  return settings
}

function check(settings){
  let changes = 0
  Object.keys(DEFAULTS).forEach( _iSet => {
    if (settings[_iSet] === undefined || typeof settings[_iSet] != typeof DEFAULTS[_iSet]){
      settings[_iSet] = DEFAULTS[_iSet]
      changes++
    }
  })
  Object.keys(DEFAULTS.tags).forEach( _iSet => {
    if (settings.tags[_iSet] === undefined || typeof settings.tags[_iSet] != typeof DEFAULTS.tags[_iSet]){
      settings.tags[_iSet] = DEFAULTS.tags[_iSet]
      changes++
    }
  })
  if (settings.downloadLocation == ""){
    settings.downloadLocation = DEFAULTS.downloadLocation
    changes++
  }
  [
    'tracknameTemplate',
    'albumTracknameTemplate',
    'playlistTracknameTemplate',
    'playlistNameTemplate',
    'artistNameTemplate',
    'albumNameTemplate',
    'playlistFilenameTemplate',
    'coverImageTemplate',
    'artistImageTemplate',
    'paddingSize'
  ].forEach(template => {
    if (settings[template] == ""){
      settings[template] = DEFAULTS[template]
      changes++
    }
  })
  return changes
}

module.exports = {
  OverwriteOption,
  FeaturesOption,
  DEFAULTS,
  save,
  load
}