require 'lastfm'
require 'musicbrainz'
require 'nokogiri'

class ImportController < ApplicationController
  @@lastfm_api_key = '04fda005dbf61a50af5abc3e90f111f2'
  @@lastfm_secret = '19e70e98b291e9f15d0516925945eb1b'
  
  def self.importArtist name, dry_run = false
    
    # Initializing gems
    lastfm = Lastfm.new(@@lastfm_api_key, @@lastfm_secret)
    
    artist = Artist.find_or_create_by_name(name)
    return 3 if artist.status == 1
    
    begin
      lastfm_artist = lastfm.artist.get_info(name)
      unless artist.mbid.nil? or artist.mbid.empty?
        brainz_artist = MusicBrainz::Artist.find(artist.mbid)
      else
        brainz_artist = MusicBrainz::Artist.find_by_name(name)
      end
    rescue => e
      lastfm_artist = {
        'bio' => { 'summary' => '' },
        'image' => [ nil, nil, nil, { 'content' => '' } ],
        'stats' => { 'listeners' => 0 }
      }
      ap e.message
      ap e.backtrace
    end

    begin
      # Save artist
      artist.desc = lastfm_artist['bio']['summary']
      artist.pic_url = lastfm_artist['image'][3]['content']
      artist.listeners = lastfm_artist['stats']['listeners']
      artist.artist_type = brainz_artist.type
      artist.mbid = brainz_artist.id
      dry_run ? ap(artist) : artist.save
    
      brainz_artist.release_groups.each do |brainz_release_group|
        # Saving album
        begin
          album_lastfm = lastfm.album.get_info(lastfm_artist['name'], brainz_release_group.title)
          album_image = album_lastfm['image'][3]['content']
        rescue
          album_image = ''
        end
        album = Album.new
        album.name = brainz_release_group.title
        album.year = brainz_release_group.first_release_date.year
        album.artist_id = artist.id
        album.mbid = brainz_release_group.id
        album.album_type = brainz_release_group.type
        album.pic_url = album_image
        album.has_pic = (album_image != '' and not album_image.nil?)
        album.status = 0
        dry_run ? ap(album) : album.save
        # Tracks from the first release
        tracks_hashed = []
        brainz_release_group.releases.each_with_index do |brainz_release, i|
          # Processing tracks
          brainz_release.tracks.each do |brainz_track|
            track_title = brainz_track.title.gsub(/\s\/\s\[.*?\]/, '')
            if tracks_hashed.include? track_title.downcase.scan(/[a-z0-9]*/).join
              next
            end
            tracks_hashed << track_title.downcase.scan(/[a-z0-9]*/).join
            track = Track.new
            track.name = track_title
            track.album_id = album.id
            track.position = brainz_track.position
            track.length = brainz_track.length
            track.country = brainz_release.country
            track.bonus = (i == 0 ? 0 : 1)
            track.live = track_title.downcase.include? 'live'
            track.acoustic = track_title.downcase.include? 'acoustic'
            track.mbid = brainz_track.recording_id
            dry_run ? ap(track) : track.save
          end
        end
        album.status = 1
        album.save unless dry_run
      end
      
      artist.status = 1
    rescue => e
      ap e.message
      ap e.backtrace
      artist.status = 2
    end
    
    artist.save unless dry_run
    artist.status
  end
  
  def self.parseLastfmXML path
    Nokogiri::XML(open(path)).css('lfm > artists > artist').map do |node|
      artist = {}
      artist[:name] = node.css('name').text
      artist[:mbid] = nil
      artist[:mbid] = node.css('mbid').text unless node.css('mbid').empty?
      artist
    end
  end
  
end