from management.management.utils.utils import create_audit_log
from management.models.ore_plan import OrePlan
from management.repositories.ore_plan import OrePlanRepository
from management.serializers.plan_archivio_serializer import OrePlanGetItemsSerializer

from .base import *

class ConsuntivazioneAPIView(GenericViewSet):
    authentication_classes = [TokenAuthentication]
    _repository = OrePlanRepository()
    
    @requires_auth(permission=[os.getenv('GESTORE'), os.getenv('INCARICATO')])
    def get_items(self, request: Request, pk:int) -> Response:
        try:
            ore_plan = OrePlan.objects.filter(plan_item=pk)
            serializer = OrePlanGetItemsSerializer(ore_plan, many=True)
            return Response(serializer.data)

        except Exception as e:
            handle_exception(e)
    
    @requires_auth(permission=[os.getenv('GESTORE'), os.getenv('INCARICATO')])
    def save_item(self, request: Request):
        try:
            dto = request.data
            dto["autore"] = request.user_id 
            dto["utente"] = request.user_id 
            status_result, errors = self._repository.save(dto, request.user_id)
            
            if not status_result:
                return Response({'detail': 'An error occurred.'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

            return Response(GenericResponseObjectSerializer(GenericResponseObject(status=True)).data)
        except Exception as e:
            handle_exception(e)
    
    @requires_auth(permission=[os.getenv('GESTORE'), os.getenv('INCARICATO')])
    def delete_item(self, request: Request, pk):
        try:
            instance = OrePlan.objects.get(id=pk)
            old_values = {
                "ore": float(instance.ore) if instance.ore is not None else 0.0,
                "ore_extra_cliente": float(instance.ore_extra_cliente) if instance.ore_extra_cliente is not None else 0.0,
                "ore_extra_produzione": float(instance.ore_extra_produzione) if instance.ore_extra_produzione is not None else 0.0,
                "ore_extra_review": float(instance.ore_extra_review) if instance.ore_extra_review is not None else 0.0,
                "note": instance.note if instance.note else '',
            }
            create_audit_log(
                user=request.user_id,
                activity_type='CANCELLAZIONE ORE',
                entity=instance,
                entity_name='OrePlan',
                entity_id=instance.plan_item.id,
                old_values=old_values,
                new_values=None
            )
            self._repository.delete(pk)
            return Response(GenericResponseObjectSerializer(GenericResponseObject(status=True)).data)
        except Exception as e:
            handle_exception(e)