from datetime import date, timedelta

from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand

from apps.administrations.models import SOP, SOPVersion

User = get_user_model()

SOPS = [
    {
        "code": "SOP-HR-2026-01",
        "title": "Onboarding Karyawan Baru CSIS",
        "category": "Human Resources",
        "version": "2.1",
        "status": "active",
        "tags": ["onboarding", "hr", "orientasi"],
        "effective_date": date(2026, 3, 10),
        "content": "Prosedur orientasi 2 minggu untuk peneliti dan staf operasional baru.\n\n1. Hari 1: Penyerahan kontrak, akun email, dan kartu akses.\n2. Hari 2-5: Orientasi divisi dan pengenalan tim.\n3. Minggu 2: Penugasan mentor dan target probation.",
        "history": [
            ("1.0", date(2025, 1, 15), "Versi awal prosedur onboarding."),
            ("2.0", date(2025, 9, 1), "Tambah tahap mentor dan target probation."),
        ],
    },
    {
        "code": "SOP-OPS-2026-04",
        "title": "Alur Procurement & Approval",
        "category": "Operations",
        "version": "3.0",
        "status": "active",
        "tags": ["procurement", "approval", "pengadaan"],
        "effective_date": date(2026, 3, 5),
        "content": "Tahapan pengadaan barang/jasa dari requisition hingga payment dengan approval threshold.\n\nThreshold:\n- < Rp 5 juta: approval manager.\n- Rp 5-50 juta: approval direktur.\n- > Rp 50 juta: approval board.",
        "history": [
            ("2.0", date(2025, 6, 1), "Revisi threshold approval."),
        ],
    },
    {
        "code": "SOP-IT-2026-02",
        "title": "Incident Response Keamanan IT",
        "category": "Technology",
        "version": "1.4",
        "status": "active",
        "tags": ["security", "incident", "it"],
        "effective_date": date(2026, 2, 28),
        "content": "Protokol penanganan insiden cyber, pelaporan, dan recovery sistem kritis.\n\nFase: identifikasi, kontainmen, eradikasi, recovery, dan post-mortem.",
        "history": [],
    },
    {
        "code": "SOP-FIN-2026-03",
        "title": "Standar Pelaporan Keuangan Bulanan",
        "category": "Finance",
        "version": "2.3",
        "status": "active",
        "tags": ["finance", "pelaporan", "closing"],
        "effective_date": date(2026, 2, 20),
        "content": "Format dan timeline closing keuangan bulanan untuk konsolidasi laporan tahunan.\n\nClosing selesai maksimal H+5 setiap bulan.",
        "history": [
            ("2.0", date(2025, 7, 1), "Standardisasi format laporan."),
        ],
    },
    {
        "code": "SOP-EVT-2026-01",
        "title": "Event Planning & Logistics Checklist",
        "category": "Events & Operations",
        "version": "1.0",
        "status": "active",
        "tags": ["event", "logistics", "checklist"],
        "effective_date": date(2026, 2, 15),
        "content": "Checklist 90-hari untuk perencanaan event berskala besar (Annual Forum, Workshop ASEAN).",
        "history": [],
    },
    {
        "code": "SOP-OPS-2026-05",
        "title": "Asset Disposal & Decommissioning",
        "category": "Operations",
        "version": "1.2",
        "status": "review",
        "tags": ["asset", "disposal", "compliance"],
        "effective_date": date(2026, 4, 10),
        "content": "Prosedur disposal aset IT dan furniture dengan compliance pencatatan.\n\nSetiap disposal wajib disetujui Asset Manager dan dicatat di register aset.",
        "history": [],
    },
    {
        "code": "SOP-RES-2026-02",
        "title": "Research Ethics & Peer Review",
        "category": "Research",
        "version": "2.0",
        "status": "active",
        "tags": ["research", "ethics", "peer-review"],
        "effective_date": date(2026, 4, 1),
        "content": "Standar etika riset, konflik kepentingan, dan proses peer review internal.\n\nSetiap publikasi melewati minimal 2 reviewer independen.",
        "history": [
            ("1.0", date(2024, 11, 1), "Versi awal standar etika riset."),
        ],
    },
    {
        "code": "SOP-PUB-2026-01",
        "title": "Editorial Workflow Indonesian Quarterly",
        "category": "Publications",
        "version": "1.1",
        "status": "obsolete",
        "tags": ["editorial", "publikasi", "jurnal"],
        "effective_date": date(2025, 1, 15),
        "content": "Alur editorial dari submission hingga publish untuk jurnal kuartalan. Digantikan oleh workflow digital baru.",
        "history": [],
    },
    {
        "code": "SOP-HR-2026-06",
        "title": "Pengajuan Cuti & Izin",
        "category": "Human Resources",
        "version": "1.0",
        "status": "draft",
        "tags": ["hr", "cuti", "leave"],
        "effective_date": date(2026, 6, 1),
        "content": "Prosedur pengajuan cuti tahunan, sakit, dan izin khusus melalui sistem HRIS.\n\nPengajuan cuti tahunan minimal H-3 kerja.",
        "history": [],
    },
    {
        "code": "SOP-IT-2026-07",
        "title": "Backup & Disaster Recovery",
        "category": "Technology",
        "version": "1.0",
        "status": "active",
        "tags": ["it", "backup", "dr"],
        "effective_date": date(2026, 1, 20),
        "content": "Jadwal backup harian dan prosedur disaster recovery untuk sistem kritis.\n\nRPO 24 jam, RTO 4 jam untuk sistem prioritas.",
        "history": [],
    },
]


class Command(BaseCommand):
    help = "Seed SOPs with version history"

    def handle(self, *args, **options):
        users = list(User.objects.all()[:6])
        if not users:
            self.stdout.write(self.style.ERROR("No users found. Seed users first."))
            return

        created = 0
        for i, data in enumerate(SOPS):
            if SOP.objects.filter(code=data["code"]).exists():
                self.stdout.write(f"  - {data['code']} exists, skipping.")
                continue
            author = users[i % len(users)]
            sop = SOP.objects.create(
                code=data["code"],
                title=data["title"],
                category=data["category"],
                content=data["content"],
                version=data["version"],
                status=data["status"],
                tags=data["tags"],
                effective_date=data["effective_date"],
                author=author,
            )
            for version, eff, note in data["history"]:
                SOPVersion.objects.create(
                    sop=sop,
                    version=version,
                    content=data["content"],
                    effective_date=eff,
                    change_note=note,
                    changed_by=author,
                )
            SOPVersion.objects.create(
                sop=sop,
                version=data["version"],
                content=data["content"],
                effective_date=data["effective_date"],
                change_note="Current version." if data["history"] else "Initial version.",
                changed_by=author,
            )
            created += 1
            self.stdout.write(f"  + {sop.code}  {sop.title}")

        self.stdout.write(self.style.SUCCESS(f"Seeded {created} SOPs."))
