from management.management.utils.utils import create_audit_log
from management.models.ore_plan import OrePlan
from management.serializers.plan_archivio_serializer import OrePlanSerializer
from .base import *

class OrePlanRepository(BaseRepository):
    entity=OrePlan

    @transaction.atomic
    def save(self, dto, user_id=None) -> tuple:
        ore_plan_id = dto.get("id")
        old_values = {}
        instance = None
        dto_data = dto.copy()
        
        if ore_plan_id:
            if isinstance(dto_data.get("plan_item"), dict):
                dto["plan_item"] = dto_data["plan_item"].get("id")
            try:
                instance = OrePlan.objects.get(id=ore_plan_id)
            except OrePlan.DoesNotExist:
                return False, {"detail": "OrePlan not found"}
            old_values = OrePlanSerializer(instance).data
            serializer = OrePlanSerializer(instance, data=dto, partial=True)
        else:
            serializer = OrePlanSerializer(data=dto)

        serializer.is_valid(raise_exception=True)
        ore_plan = serializer.save()
        activity_type = "CREAZIONE ORE" if not ore_plan_id else "MODIFICA ORE"

        if instance:
            new_values = {
                "ore": {
                    "old": float(old_values.get("ore")) if old_values.get("ore") is not None else 0.0,
                    "new": float(ore_plan.ore) if ore_plan.ore is not None else 0.0
                },
                "ore_extra_cliente": {
                    "old": float(old_values.get("ore_extra_cliente")) if old_values.get("ore_extra_cliente") is not None else 0.0,
                    "new": float(ore_plan.ore_extra_cliente) if ore_plan.ore_extra_cliente is not None else 0.0
                },
                "ore_extra_produzione": {
                    "old": float(old_values.get("ore_extra_produzione")) if old_values.get("ore_extra_produzione") is not None else 0.0,
                    "new": float(ore_plan.ore_extra_produzione) if ore_plan.ore_extra_produzione is not None else 0.0
                },
                "ore_extra_review": {
                    "old": float(old_values.get("ore_extra_review")) if old_values.get("ore_extra_review") is not None else 0.0,
                    "new": float(ore_plan.ore_extra_review) if ore_plan.ore_extra_review is not None else 0.0
                },
                "note": {
                    "old": old_values.get("note") if old_values.get("note") is not None else '',
                    "new": ore_plan.note if ore_plan.note else ''
                },
            }
        else:
            new_values = {
                "ore": {
                    "old": '',
                    "new": float(ore_plan.ore) if ore_plan.ore is not None else 0.0
                },
                "ore_extra_cliente": {
                    "old": '',
                    "new": float(ore_plan.ore_extra_cliente) if ore_plan.ore_extra_cliente is not None else 0.0
                },
                "ore_extra_produzione": {
                    "old": '',
                    "new": float(ore_plan.ore_extra_produzione) if ore_plan.ore_extra_produzione is not None else 0.0
                },
                "ore_extra_review": {
                    "old": '',
                    "new": float(ore_plan.ore_extra_review) if ore_plan.ore_extra_review is not None else 0.0
                },
                "note": {
                    "old": '',
                    "new": ore_plan.note if ore_plan.note else ''
                },
            }

        plan_id = dto.get("plan_item")

        
        create_audit_log(
            user=user_id,
            activity_type=activity_type,
            entity_name='OrePlan',
            entity=ore_plan,
            entity_id=plan_id,
            old_values=None,
            new_values=new_values
        )
        return True, {"id": ore_plan.id}
