import json
from django.db import models

from django.core.files.uploadedfile import UploadedFile
from datetime import date, datetime, time
from decimal import Decimal
class IncomingApiEmx(models.Model):
    user_id = models.BigIntegerField(blank=True, null=True)
    incoming_params = models.JSONField(null=True, blank=True)
    outgoing_params = models.JSONField(null=True, blank=True)
    url = models.CharField(max_length=255, blank=True)
    ip = models.CharField(max_length=100, blank=True)
    scode = models.IntegerField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def make_json_safe(obj):
        if isinstance(obj, UploadedFile):
            return {
                "name": obj.name,
                "size": obj.size,
                "content_type": getattr(obj, "content_type", None),
            }

        if isinstance(obj, (datetime, date, time)):
            return obj.isoformat()

        if isinstance(obj, Decimal):
            return float(obj)

        if isinstance(obj, dict):
            return {str(k): IncomingApiEmx.make_json_safe(v) for k, v in obj.items()}

        if isinstance(obj, (list, tuple, set)):
            return [IncomingApiEmx.make_json_safe(v) for v in obj]

        try:
            return obj
        except TypeError:
            return str(obj)

    class Meta:
        db_table = 'incoming_api_emx'

    @staticmethod
    def insert_log(request_data, user_id=None, url=None, ip=None):
        safe_request_data = IncomingApiEmx.make_json_safe(request_data)
        log = IncomingApiEmx.objects.create(
            user_id=user_id,
            incoming_params=safe_request_data,
            url=url,
            ip=ip,
        )
        return log.id

    @staticmethod
    def update_log(log_id, response_data,scode):
        try:
            log = IncomingApiEmx.objects.get(id=log_id)
            log.outgoing_params = IncomingApiEmx.make_json_safe(response_data)
            log.scode = scode
            log.save()
        except IncomingApiEmx.DoesNotExist:
            pass