package migrations

import (
	"context"
	"database/sql"

	"github.com/pressly/goose/v3"
)

func init() {
	goose.AddMigrationContext(Up20200220143731, Down20200220143731)
}

func Up20200220143731(ctx context.Context, tx *sql.Tx) error {
	notice(ctx, tx, "This migration will force the next scan to be a full rescan!")
	_, err := tx.ExecContext(ctx, `
create table media_file_dg_tmp
(
	id varchar(255) not null
		primary key,
	path varchar(255) default '' not null,
	title varchar(255) default '' not null,
	album varchar(255) default '' not null,
	artist varchar(255) default '' not null,
	artist_id varchar(255) default '' not null,
	album_artist varchar(255) default '' not null,
	album_id varchar(255) default '' not null,
	has_cover_art bool default FALSE not null,
	track_number integer default 0 not null,
	disc_number integer default 0 not null,
	year integer default 0 not null,
	size integer default 0 not null,
	suffix varchar(255) default '' not null,
	duration real default 0 not null,
	bit_rate integer default 0 not null,
	genre varchar(255) default '' not null,
	compilation bool default FALSE not null,
	created_at datetime,
	updated_at datetime
);

insert into media_file_dg_tmp(id, path, title, album, artist, artist_id, album_artist, album_id, has_cover_art, track_number, disc_number, year, size, suffix, duration, bit_rate, genre, compilation, created_at, updated_at) select id, path, title, album, artist, artist_id, album_artist, album_id, has_cover_art, track_number, disc_number, year, size, suffix, duration, bit_rate, genre, compilation, created_at, updated_at from media_file;

drop table media_file;

alter table media_file_dg_tmp rename to media_file;

create index media_file_album_id
	on media_file (album_id);

create index media_file_genre
	on media_file (genre);

create index media_file_path
	on media_file (path);

create index media_file_title
	on media_file (title);

create table album_dg_tmp
(
	id varchar(255) not null
		primary key,
	name varchar(255) default '' not null,
	artist_id varchar(255) default '' not null,
	cover_art_path varchar(255) default '' not null,
	cover_art_id varchar(255) default '' not null,
	artist varchar(255) default '' not null,
	album_artist varchar(255) default '' not null,
	year integer default 0 not null,
	compilation bool default FALSE not null,
	song_count integer default 0 not null,
	duration real default 0 not null,
	genre varchar(255) default '' not null,
	created_at datetime,
	updated_at datetime
);

insert into album_dg_tmp(id, name, artist_id, cover_art_path, cover_art_id, artist, album_artist, year, compilation, song_count, duration, genre, created_at, updated_at) select id, name, artist_id, cover_art_path, cover_art_id, artist, album_artist, year, compilation, song_count, duration, genre, created_at, updated_at from album;

drop table album;

alter table album_dg_tmp rename to album;

create index album_artist
	on album (artist);

create index album_artist_id
	on album (artist_id);

create index album_genre
	on album (genre);

create index album_name
	on album (name);

create index album_year
	on album (year);

create table playlist_dg_tmp
(
	id varchar(255) not null
		primary key,
	name varchar(255) default '' not null,
	comment varchar(255) default '' not null,
	duration real default 0 not null,
	owner varchar(255) default '' not null,
	public bool default FALSE not null,
	tracks text not null
);

insert into playlist_dg_tmp(id, name, comment, duration, owner, public, tracks) select id, name, comment, duration, owner, public, tracks from playlist;

drop table playlist;

alter table playlist_dg_tmp rename to playlist;

create index playlist_name
	on playlist (name);

-- Force a full rescan
delete from property where id like 'LastScan%';
update media_file set updated_at = '0001-01-01';
`)
	return err
}

func Down20200220143731(_ context.Context, _ *sql.Tx) error {
	return nil
}
