"""
management command: seed_expense_workflow
=========================================
Creates (or updates) the default Django Groups and the standard 5-stage
Expense Approval Workflow.  Safe to re-run — fully idempotent.

Usage:
    python manage.py seed_expense_workflow
"""

from django.contrib.auth.models import Group
from django.core.management.base import BaseCommand

from expense.models import ExpenseApprovalStage, ExpenseApprovalWorkflow

# -------------------------------------------------------------------
# Groups to create
# -------------------------------------------------------------------
GROUPS = [
    "HOD",
    "Director",
    "MD",
    "Accountant",
    "Disbursement",
]

# -------------------------------------------------------------------
# Default workflow definition
# Each entry: (order, stage_name, group_name, is_disbursement_stage)
# -------------------------------------------------------------------
WORKFLOW_NAME = "Standard Expense Approval"
WORKFLOW_DESC = (
    "Default 5-stage expense approval: HOD → Director → MD → "
    "Accountant → Disbursement"
)

STAGES = [
    (1, "HOD Approval",          "HOD",          False),
    (2, "Director Approval",     "Director",     False),
    (3, "MD Approval",           "MD",           False),
    (4, "Accountant Review",     "Accountant",   False),
    (5, "Disbursement",          "Disbursement", True),
]


class Command(BaseCommand):
    help = "Seed Django Groups and the default Expense Approval Workflow (idempotent)."

    def handle(self, *args, **options):
        self._seed_groups()
        self._seed_workflow()

    # ------------------------------------------------------------------
    def _seed_groups(self):
        self.stdout.write("\nGroups:")
        for name in GROUPS:
            group, created = Group.objects.get_or_create(name=name)
            status = "created" if created else "already exists"
            self.stdout.write(f"  [{status:>14}]  {name}")

    # ------------------------------------------------------------------
    def _seed_workflow(self):
        self.stdout.write("\nWorkflow:")

        workflow, created = ExpenseApprovalWorkflow.objects.get_or_create(
            name=WORKFLOW_NAME,
            defaults={"description": WORKFLOW_DESC, "is_active": True},
        )

        if created:
            self.stdout.write(f"  [       created]  {WORKFLOW_NAME}")
        else:
            self.stdout.write(f"  [ already exists]  {WORKFLOW_NAME}")

        self.stdout.write("\nStages:")
        for order, stage_name, group_name, is_disbursement in STAGES:
            group = Group.objects.get(name=group_name)
            stage, created = ExpenseApprovalStage.objects.get_or_create(
                workflow=workflow,
                order=order,
                defaults={
                    "name": stage_name,
                    "group": group,
                    "is_disbursement_stage": is_disbursement,
                    "is_active": True,
                },
            )
            if not created:
                # Update name/group/disbursement flag in case they drifted
                updated = False
                if stage.name != stage_name:
                    stage.name = stage_name
                    updated = True
                if stage.group_id != group.pk:
                    stage.group = group
                    updated = True
                if stage.is_disbursement_stage != is_disbursement:
                    stage.is_disbursement_stage = is_disbursement
                    updated = True
                if updated:
                    stage.save()

            status = "created" if created else "already exists"
            disbursement_tag = " [DISBURSEMENT]" if is_disbursement else ""
            self.stdout.write(
                f"  [{status:>14}]  Stage {order}: {stage_name}{disbursement_tag}"
            )

        self.stdout.write(
            self.style.SUCCESS(
                "\nDone. Default workflow is ready for expense approvals."
            )
        )
