require "dotenv"
Dotenv.load

require "mysql2"

module Database
  def self.data(upcs, type)
    if type == "release"
      Database.get_releases(upcs)
    elsif type == "track"
      Database.get_tracks(upcs)
    elsif type == "writer"
      Database.get_writers(upcs)
    end
  end

  private

  def self.get_db_client
    Mysql2::Client.new(host: ENV["HOST"],
                       username: ENV["USERNAME"],
                       password: ENV["PASSWORD"],
                       database: ENV["DATABASE"])
  end

  def self.get_releases(dbh=Database.get_db_client, upcs)
    res = dbh.query("SELECT ra.* FROM release_artist ra
                     INNER JOIN releases r ON r.release_id = ra.release_id
                     WHERE 1
                     AND ra.artist_info_id is NULL
                     AND r.upc IN (#{upcs})")

    res.each_with_object([]) do | row, data |
      data << {
        release_artist_id: row['release_artist_id'],
        upc: row['upc'],
        role: row['role'],
        release_id: row['release_id'],
        artist_name: row['artist_name']
      }
    end
  end

  def self.get_tracks(dbh=Database.get_db_client, upcs)
    res = dbh.query("SELECT ta.* FROM track_artist ta
                     INNER JOIN track t ON t.id = ta.track_id
                     WHERE 1
                     AND ta.artist_info_id IS NULL
                     AND t.upc IN (#{upcs})")

    res.each_with_object([]) do | row, data |
      data << {
        id: row["id"],
        track_id: row["track_id"],
        type: row["type"],
        name: row["name"],
      }
    end
  end

  def self.get_writers(dbh=Database.get_db_client, upcs)
    res = dbh.query("SELECT * FROM track_writer
                     WHERE 1
                     AND artist_info_id IS NULL
                     AND upc IN (#{upcs})")

    res.each_with_object([]) do | row, data |
      data << {
        track_writer_id: row["track_writer_id"],
        writer_name: row["writer_name"],
        upc: row["upc"],
        cd: row["cd"],
        track_id: row["track_id"],
        unique_track_id: row["unique_track_id"]
      }
    end
  end
end
