# Generated by Django 4.1.13 on 2024-12-03 09:23
from datetime import timedelta as dt_timedelta

import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models

import common.db.fields


def migrate_account_backup(apps, schema_editor):
    old_backup_model = apps.get_model('accounts', 'AccountBackupAutomation')
    account_backup_model = apps.get_model('accounts', 'BackupAccountAutomation')
    backup_id_old_new_map = {}
    for backup in old_backup_model.objects.all():
        data = {
            'comment': backup.comment,
            'created_by': backup.created_by,
            'updated_by': backup.updated_by,
            'date_created': backup.date_created,
            'date_updated': backup.date_updated,
            'name': backup.name,
            'interval': backup.interval,
            'crontab': backup.crontab,
            'is_periodic': backup.is_periodic,
            'start_time': backup.start_time,
            'date_last_run': backup.date_last_run,
            'org_id': backup.org_id,
            'type': 'backup_account',
            'types': backup.types,
            'backup_type': backup.backup_type,
            'is_password_divided_by_email': backup.is_password_divided_by_email,
            'is_password_divided_by_obj_storage': backup.is_password_divided_by_obj_storage,
            'zip_encrypt_password': backup.zip_encrypt_password
        }
        obj = account_backup_model.objects.create(**data)
        backup_id_old_new_map[str(backup.id)] = str(obj.id)
        obj.recipients_part_one.set(backup.recipients_part_one.all())
        obj.recipients_part_two.set(backup.recipients_part_two.all())
        obj.obj_recipients_part_one.set(backup.obj_recipients_part_one.all())
        obj.obj_recipients_part_two.set(backup.obj_recipients_part_two.all())

    old_execution_model = apps.get_model('accounts', 'AccountBackupExecution')
    backup_execution_model = apps.get_model('accounts', 'AutomationExecution')

    for execution in old_execution_model.objects.all():
        automation_id = backup_id_old_new_map.get(str(execution.plan_id))
        if not automation_id:
            continue
        snapshot = execution.snapshot
        snapshot['type'] = "backup_account"
        data = {
            'automation_id': automation_id,
            'date_start': execution.date_start,
            'duration': int(execution.timedelta),
            'date_finished': execution.date_start + dt_timedelta(seconds=int(execution.timedelta)),
            'snapshot': execution.snapshot,
            'trigger': execution.trigger,
            'status': 'error' if execution.reason == '-' else 'success',
            'org_id': execution.org_id
        }
        backup_execution_model.objects.create(**data)


class Migration(migrations.Migration):
    dependencies = [
        ('assets', '0010_alter_automationexecution_duration'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('terminal', '0003_auto_20171230_0308'),
        ('accounts', '0018_changesecretrecord_ignore_fail_and_more'),
    ]

    operations = [
        migrations.CreateModel(
            name='BackupAccountAutomation',
            fields=[
                ('baseautomation_ptr',
                 models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True,
                                      primary_key=True, serialize=False, to='assets.baseautomation')),
                ('types', models.JSONField(default=list)),
                ('backup_type',
                 models.CharField(choices=[('email', 'Email'), ('object_storage', 'SFTP')], default='email',
                                  max_length=128, verbose_name='Backup type')),
                ('is_password_divided_by_email', models.BooleanField(default=True, verbose_name='Password divided')),
                ('is_password_divided_by_obj_storage',
                 models.BooleanField(default=True, verbose_name='Password divided')),
                ('zip_encrypt_password', common.db.fields.EncryptCharField(blank=True, max_length=4096, null=True,
                                                                           verbose_name='Zip encrypt password')),
                ('obj_recipients_part_one',
                 models.ManyToManyField(blank=True, related_name='obj_recipient_part_one_plans',
                                        to='terminal.replaystorage', verbose_name='Object storage recipient part one')),
                ('obj_recipients_part_two',
                 models.ManyToManyField(blank=True, related_name='obj_recipient_part_two_plans',
                                        to='terminal.replaystorage', verbose_name='Object storage recipient part two')),
                ('recipients_part_one', models.ManyToManyField(blank=True, related_name='recipient_part_one_plans',
                                                               to=settings.AUTH_USER_MODEL,
                                                               verbose_name='Recipient part one')),
                ('recipients_part_two', models.ManyToManyField(blank=True, related_name='recipient_part_two_plans',
                                                               to=settings.AUTH_USER_MODEL,
                                                               verbose_name='Recipient part two')),
            ],
            options={
                'verbose_name': 'Account backup plan',
            },
            bases=('accounts.accountbaseautomation',),
        ),
        migrations.RunPython(migrate_account_backup),
        migrations.RemoveField(
            model_name='accountbackupexecution',
            name='plan',
        ),
        migrations.DeleteModel(
            name='AccountBackupAutomation',
        ),
        migrations.DeleteModel(
            name='AccountBackupExecution',
        ),
        migrations.RemoveField(
            model_name='gatheredaccount',
            name='authorized_keys',
        ),
        migrations.RemoveField(
            model_name='gatheredaccount',
            name='groups',
        ),
        migrations.RemoveField(
            model_name='gatheredaccount',
            name='sudoers',
        ),
        migrations.AddField(
            model_name='gatheredaccount',
            name='detail',
            field=models.JSONField(blank=True, default=dict, verbose_name='Detail'),
        ),
    ]