using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Migrations;

namespace NadekoBot.Migrations;

public static class MigrationQueries
{
    public static void MigrateRero(MigrationBuilder migrationBuilder)
    {
        if (migrationBuilder.IsMySql())
        {
            migrationBuilder.Sql(
                @"INSERT IGNORE into reactionroles(guildid, channelid, messageid, emote, roleid, `group`, levelreq, dateadded)
select guildid, channelid, messageid, emotename, roleid, exclusive, 0, reactionrolemessage.dateadded
from reactionrole
left join reactionrolemessage on reactionrolemessage.id = reactionrole.reactionrolemessageid
left join guildconfigs on reactionrolemessage.guildconfigid = guildconfigs.id;");
        }
        else if (migrationBuilder.IsSqlite())
        {
            migrationBuilder.Sql(
                @"insert or ignore into reactionroles(guildid, channelid, messageid, emote, roleid, 'group', levelreq, dateadded)
select guildid, channelid, messageid, emotename, roleid, exclusive, 0, reactionrolemessage.dateadded
from reactionrole
left join reactionrolemessage on reactionrolemessage.id = reactionrole.reactionrolemessageid
left join guildconfigs on reactionrolemessage.guildconfigid = guildconfigs.id;");
        }
        else if (migrationBuilder.IsNpgsql())
        {
            migrationBuilder.Sql(@"insert into reactionroles(guildid, channelid, messageid, emote, roleid, ""group"", levelreq, dateadded)
            select guildid, channelid, messageid, emotename, roleid, exclusive::int, 0, reactionrolemessage.dateadded
                from reactionrole
                left join reactionrolemessage on reactionrolemessage.id = reactionrole.reactionrolemessageid
            left join guildconfigs on reactionrolemessage.guildconfigid = guildconfigs.id
            ON CONFLICT DO NOTHING;");
        }
        else
        {
            throw new NotSupportedException("This database provider doesn't have an implementation for MigrateRero");
        }
    }

    public static void GuildConfigCleanup(MigrationBuilder builder)
    {
        builder.Sql($"""
                     DELETE FROM "StreamRoleBlacklistedUser" WHERE "StreamRoleSettingsId" is NULL;
                     """);

        builder.Sql($"""
                     DELETE FROM "DelMsgOnCmdChannel" WHERE "GuildConfigId" is NULL;
                     """);

        builder.Sql("""
                    DELETE FROM "WarningPunishment" WHERE "GuildConfigId" NOT IN (SELECT "Id" from "GuildConfigs");
                    """);
    }
}