# Generated by Django 2.2.28 on 2023-04-04 16:36

from django.db import migrations

from sentry.monitors.models import MonitorStatus
from sentry.new_migrations.migrations import CheckedMigration
from sentry.utils.query import RangeQuerySetWrapperWithProgressBar


def clean_up_monitors(apps, schema_editor):
    Monitor = apps.get_model("sentry", "Monitor")
    Organization = apps.get_model("sentry", "Organization")
    Project = apps.get_model("sentry", "Project")

    queryset = RangeQuerySetWrapperWithProgressBar(
        Monitor.objects.filter(monitorenvironment__isnull=True)
        .exclude(status__in=[MonitorStatus.PENDING_DELETION, MonitorStatus.DELETION_IN_PROGRESS])
        .values_list(
            "id",
            "organization_id",
            "project_id",
        ),
        result_value_getter=lambda item: item[0],
    )

    monitors_to_clean_up = []

    for monitor_id, organization_id, project_id in queryset:
        try:
            Organization.objects.get(id=organization_id)
            Project.objects.get(id=project_id)
        except (Organization.DoesNotExist, Project.DoesNotExist):
            monitors_to_clean_up.append(monitor_id)

    Monitor.objects.filter(id__in=monitors_to_clean_up).delete()


class Migration(CheckedMigration):
    # This flag is used to mark that a migration shouldn't be automatically run in production. For
    # the most part, this should only be used for operations where it's safe to run the migration
    # after your code has deployed. So this should not be used for most operations that alter the
    # schema of a table.
    # Here are some things that make sense to mark as dangerous:
    # - Large data migrations. Typically we want these to be run manually by ops so that they can
    #   be monitored and not block the deploy for a long period of time while they run.
    # - Adding indexes to large tables. Since this can take a long time, we'd generally prefer to
    #   have ops run this and not block the deploy. Note that while adding an index is a schema
    #   change, it's completely safe to run the operation after the code has deployed.
    is_dangerous = False

    dependencies = [
        ("sentry", "0405_rulesnooze_user_null"),
    ]

    operations = [
        migrations.RunPython(
            clean_up_monitors,
            migrations.RunPython.noop,
            hints={
                "tables": [
                    "sentry_monitor",
                    "sentry_organization",
                    "sentry_project",
                ]
            },
        ),
    ]
