# Generated by Django 4.2.9 on 2026-02-26 06:33

import datetime
import re
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone


def _parse_schedule(raw_value):
    schedule_type = "daily"
    schedule_time = datetime.time(2, 0)
    raw = (raw_value or "").strip().lower()
    if not raw:
        return schedule_type, schedule_time

    parts = [part for part in re.split(r"\s+", raw) if part]
    if parts and parts[0] in {"daily", "weekly", "monthly"}:
        schedule_type = parts[0]

    if len(parts) > 1:
        for fmt in ("%H:%M", "%H:%M:%S"):
            try:
                schedule_time = datetime.datetime.strptime(parts[1], fmt).time()
                break
            except ValueError:
                continue
    return schedule_type, schedule_time


def _normalize_status(raw_value):
    raw = (raw_value or "").strip()
    lowered = raw.lower()
    if not raw:
        return "idle", ""
    if lowered.startswith("success") or lowered in {"ok", "done", "completed"}:
        return "success", ""
    if lowered.startswith("running") or lowered in {"in-progress", "in progress"}:
        return "running", ""
    if lowered.startswith("failed") or lowered.startswith("error"):
        detail = raw.split(":", 1)[1].strip() if ":" in raw else raw
        return "failed", detail
    if lowered in {"idle", "not run", "not-run", "pending"}:
        return "idle", ""
    return "failed", raw


def forwards_fill_structured_backup_fields(apps, schema_editor):
    BackupConfiguration = apps.get_model("app", "BackupConfiguration")
    db_alias = schema_editor.connection.alias
    for config in BackupConfiguration.objects.using(db_alias).all():
        schedule_type, schedule_time = _parse_schedule(
            getattr(config, "schedule", "") or ""
        )
        status_value, status_message = _normalize_status(
            getattr(config, "last_manual_backup_status", "") or ""
        )
        config.schedule_type = schedule_type
        config.schedule_time = schedule_time
        config.last_manual_backup_status = status_value
        config.last_manual_backup_message = status_message
        config.save(
            update_fields=[
                "schedule_type",
                "schedule_time",
                "last_manual_backup_status",
                "last_manual_backup_message",
            ]
        )


def backwards_restore_schedule_text(apps, schema_editor):
    BackupConfiguration = apps.get_model("app", "BackupConfiguration")
    db_alias = schema_editor.connection.alias
    for config in BackupConfiguration.objects.using(db_alias).all():
        time_value = getattr(config, "schedule_time", None) or datetime.time(2, 0)
        config.schedule = f"{config.schedule_type} {time_value.strftime('%H:%M')}"
        config.save(update_fields=["schedule"])


class Migration(migrations.Migration):

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('app', '0064_backupconfiguration'),
    ]

    operations = [
        migrations.AddField(
            model_name='backupconfiguration',
            name='last_manual_backup_message',
            field=models.TextField(blank=True, default=''),
        ),
        migrations.AddField(
            model_name='backupconfiguration',
            name='schedule_time',
            field=models.TimeField(default=datetime.time(2, 0), help_text='Run time for scheduled backups (24-hour format).'),
        ),
        migrations.AddField(
            model_name='backupconfiguration',
            name='schedule_type',
            field=models.CharField(choices=[('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly')], default='daily', help_text='Backup cadence.', max_length=20),
        ),
        migrations.RunPython(
            forwards_fill_structured_backup_fields,
            backwards_restore_schedule_text,
        ),
        migrations.RemoveField(
            model_name='backupconfiguration',
            name='schedule',
        ),
        migrations.AlterField(
            model_name='backupconfiguration',
            name='last_manual_backup_status',
            field=models.CharField(choices=[('idle', 'Idle'), ('running', 'Running'), ('success', 'Success'), ('failed', 'Failed')], default='idle', max_length=20),
        ),
        migrations.AlterField(
            model_name='backupconfiguration',
            name='max_age_hours',
            field=models.PositiveIntegerField(default=48, help_text='Freshness threshold used for health status checks.'),
        ),
        migrations.AlterField(
            model_name='backupconfiguration',
            name='retention_days',
            field=models.PositiveIntegerField(default=14, help_text='How long backup files are kept before cleanup.'),
        ),
        migrations.CreateModel(
            name='BackupLog',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('operation', models.CharField(choices=[('backup', 'Backup'), ('restore', 'Restore')], max_length=20)),
                ('status', models.CharField(choices=[('running', 'Running'), ('success', 'Success'), ('failed', 'Failed')], default='running', max_length=20)),
                ('started_at', models.DateTimeField(default=django.utils.timezone.now)),
                ('finished_at', models.DateTimeField(blank=True, null=True)),
                ('duration_seconds', models.PositiveIntegerField(blank=True, null=True)),
                ('size_bytes', models.BigIntegerField(blank=True, null=True)),
                ('source_path', models.CharField(blank=True, default='', max_length=500)),
                ('output_path', models.CharField(blank=True, default='', max_length=500)),
                ('message', models.TextField(blank=True, default='')),
                ('method', models.CharField(blank=True, default='', max_length=50)),
                ('include_media', models.BooleanField(default=False)),
                ('metadata', models.JSONField(blank=True, default=dict)),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('triggered_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='backup_logs', to=settings.AUTH_USER_MODEL)),
            ],
            options={
                'verbose_name': 'Backup Log',
                'verbose_name_plural': 'Backup Logs',
                'ordering': ('-created_at',),
            },
        ),
    ]
