# -*- coding: utf-8 -*-
from django.shortcuts import render

import json
from deepdiff import DeepDiff
import re

# Create your views here.
from .models import Audit, UserActionAudit

def user_action_audit(parent_id, action_name, object_name, user, result):
    try:
        item = UserActionAudit.objects.create(
            parent_id = parent_id,
            action_name = action_name,
            object_name = object_name,
            user = user,
            result = result,
        )
    except Exception as error:
        raise error


# def changes_history(action, parent, name, created_by, old_record, new_record):
#     try:
#         print(f"RUN ACTION HISTORY")
#         pattern = r"\['([^']+)'"
#         old_value = json.loads(old_record)
#         print(f"old_value ==> {old_value}")
#         new_value = json.loads(new_record)
#         print(f"new_value ==> {new_value}")
#         instance_diff = DeepDiff(old_value, new_value, ignore_order=True)
#         print(f"instance_diff ==> {instance_diff}")
#         if "values_changed" in instance_diff:
#             for change in instance_diff["values_changed"]:
#                 field_match = re.search(pattern, change)
#                 if field_match:
#                     field = field_match.group(1)
#                 else:
#                     field = ''
#                 before = instance_diff["values_changed"][change]["old_value"]
#                 after = instance_diff["values_changed"][change]["new_value"]
#                 print(f"Field '{field}' changed from '{before}' to '{after}'")
#                 record = Audit.objects.create(
#                     action=action,
#                     parent=parent,
#                     name = name,
#                     created_by=created_by,
#                     field=field,
#                     before=before,
#                     after=after,
#                     result="Ok"
#                 )

#     except Exception as error:
#         print(f"action_history ERROR  ==> {error} ")
#         raise error

def changes_history(action, parent, name, created_by, old_record, new_record):
  try:
    print(f"RUN ACTION HISTORY")
    old_value = json.loads(old_record)
    new_value = json.loads(new_record)
    print(f"old_value ==> {old_value}")
    print(f"new_value ==> {new_value}")

    pattern = r"\['([^']+)'"
    instance_diff = DeepDiff(old_value, new_value, ignore_order=True)
    if "values_changed" in instance_diff:
       for change in instance_diff["values_changed"]:
          field_match = re.search(pattern, change)
          if field_match:
              field = field_match.group(1)
          else:
              field = ''
          before = instance_diff["values_changed"][change]["old_value"]
          after = instance_diff["values_changed"][change]["new_value"]
          print(f"Field '{field}' changed from '{before}' to '{after}'")
          record = Audit.objects.create(
              action=action,
              parent=parent,
              name = name,
              created_by=created_by,
              field=field,
              before=before,
              after=after,
              result="Ok"
          )


    # Перевірка наявності ключа 'quantity' в обох словниках
    if 'quantity' in old_value and 'quantity' in new_value:
      quantity_diff = float(new_value['quantity']) - float(old_value['quantity'])
      if quantity_diff != 0:
        field = 'Кількість'
        before = old_value['quantity']
        after = new_value['quantity']
        print(f"Field '{field}' changed from '{before}' to '{after}'")
        record = Audit.objects.create(
          action=action,
          parent=parent,
          name=name,
          created_by=created_by,
          field=field,
          before=before,
          after=after,
          result="Ok"
        )
      # Якщо ключ 'quantity' відсутній в одному із словників, значить додано/видалено товар
      if 'quantity' in new_value:  # Товар додано
        quantity = new_value['quantity']
        print(f"{action} товар '{name}' (кількість: {quantity})")
        record = Audit.objects.create(
          action=action,
          parent=parent,
          name=name,
          created_by=created_by,
          field='Кількість',
          after=quantity,
          result="Ok"
        )
      else:  # Товар видалено
        print(f"{action} товар '{name}'")
        record = Audit.objects.create(
          action=action,
          parent=parent,
          name=name,
          created_by=created_by,
          field='Кількість',
          before=old_value[0].get('quantity', 0),  # Використовуємо old_value.get('quantity', 0) для уникнення помилки KeyError
          result="Ok"
        )

  except Exception as error:
    print(f"changes_history ERROR ==> {error}")

def history_detail(request, id):
    
    history = Audit.objects.filter(parent= id).order_by("created_at")
    return render(request, 'history_page.html', context={"history":history}) 

        # pattern = r"\['([^']+)'"
        # old_value = json.loads(old_record)
        # new_value = json.loads(new_record)
        # print(f"old_value ==> {old_value}")
        # print(f"new_value ==> {new_value}")
        # instance_diff = DeepDiff(old_value, new_value, ignore_order=True)
        # print(f"instance_diff ==> {instance_diff}")
        # if "values_changed" in instance_diff:
        #     for change in instance_diff["values_changed"]:
        #         field_match = re.search(pattern, change)
        #         field = re.search(pattern, change)
        #         print(f"field ==> {field}")
        #         if field:
        #             field = field.group(1)
        #             before = instance_diff["values_changed"][change]["old_value"]
        #             after = instance_diff["values_changed"][change]["new_value"]
        #             print(f"Field '{field}' changed from '{before}' to '{after}'")
        #             record = Audit.objects.create(
        #                     action = action,
        #                     parent = parent,
        #                     name = name,
        #                     created_by = created_by,
        #                     field = field,
        #                     before = before,
        #                     after = after,
        #                     result = "Ok",
        #                 )
        #         else:
        #             print("ELSE")
        #             before = instance_diff["values_changed"][change]["old_value"]
        #             after = instance_diff["values_changed"][change]["new_value"]
        #             print(f"Field '{field}' changed from '{before}' to '{after}'")
        #             record = Audit.objects.create(
        #                     action = action,
        #                     parent = parent,
        #                     name = name,
        #                     created_by = created_by,
        #                     field = '',
        #                     before = before,
        #                     after = after,
        #                     result = "Ok",
        #                 )







        # d = DeepDiff(current, new, ignore_order=True)
        # added = set()
        # removed = set()
        # changed = d.get("values_changed", dict())
        # for key_change, change in d.get("type_changes", dict()).items():
        #     if change["new_value"] == change["old_value"]: # str vs unicode type changes
        #         continue
        #     else:
        #         changed[key_change] = change
        #         # print(f"change ==> {change}")
        #         # field_name = list(change['old_value'].keys())[0]
        #         # before = change['old_value'][field_name]
        #         # after = change['new_value'][0].get(field_name)
        #         # print(f"field ==> {field_name}  , before ==> {before} , after ==> {after}")
        #         # record = Audit.objects.create(
        #         #         action = 'action',
        #         #         parent = 'parent',
        #         #         created_by = 'created_by',
        #         #         field = field_name,
        #         #         before = before,
        #         #         after = after,
        #         #         result = 'result',
        #         #     )
        # for key in ["dictionary_item_added", "iterable_item_added", "attribute_added",
        #             "set_item_added"]:
        #     added = added.union(d.get(key, set()))
        # for key in ["dictionary_item_removed", "iterable_item_removed", "attribute_removed",
        #             "set_item_removed"]:
        #     removed = removed.union(d.get(key, set()))

        # print(f"changed ==> {changed}")
        # if changed:
        #     for change in changed:
        #         print(f" change TYPE ==> {type(change)}")
        #         print(change, "->", changed[change])
        #         print(f"change ==>{change} ==>  {changed[change].keys()}")
        #         print(f"fild == > {list([change])}")
        #         print(f"fild == > {change.split('.')[-1]}")
        #         # field = change.split(".")[-1]
        #         before = changed[change]["old_value"]
        #         print(f"before ==> {before}")
        #         after = changed[change]["new_value"]
        #         print(f"after ==> {after}")
                # field_name = list(change['root']['old_value'].keys())[0]
                # print(f"field_name ==> {field_name}")
                # field_name = list(changed['root']['old_value'].keys())[0]
                # before = changed["root"]['old_value'][field_name]
                # after = changed["root"]['new_value'][0].get(field_name)
                # print(f"field ==> {field_name}  , before ==> {before} , after ==> {after}")
        # print(f"added ==> {added}")
        # print(f"removed ==> {removed}")
        # print(f"changed ==> {changed}")
        # return added, removed, changed





# def action_history(action, parent , created_by, field=None, old_record=None, new_record=None, result=None):
#     try:
#         print(f""" action ==> {action} 
#                 parent ==> {parent} 
#                 created_by ==> {created_by} 
#                 field ==> {field} 
#                 old_record ==> {old_record} 
#                 new_record ==> {new_record}
#                 result ==> {result} """)

#         if old_record and new_record:
#             old_record = json.loads(old_record)
#             new_record = json.loads(new_record)
#             instance_diff = DeepDiff(old_record, new_record, ignore_order=True)
#             print(f"instance_diff ==> {instance_diff}")
#             if "values_changed" in instance_diff:
#                 for change in instance_diff["values_changed"]:
#                     # field = change.split(".")[-1]
#                     field = change.split("'")[-2]
#                     before = instance_diff["values_changed"][change]["old_value"]
#                     after = instance_diff["values_changed"][change]["new_value"]
#                     print(f"Field '{field}' changed from '{before}' to '{after}'")
#                     record = Audit.objects.create(
#                         action = action,
#                         parent = parent,
#                         created_by = created_by,
#                         field = field,
#                         before = before,
#                         after = after,
#                         result = result,
#                     )
#         else:
#             print("WITHOUT BEFORE AFTER ")
#             record = Audit.objects.create(
#                 action = action,
#                 parent = parent,
#                 created_by = created_by,
#                 field = field,
#                 result = result,
#             )
#     except Exception as error:
#         print(f"action_history ERROR  ==> {error} ")
#         raise error



# def diff_configs(current, new):
#     """Diffs to dict using DeepDiff and returning the changes ready to print

#     Keys present in current but missing in new are considered unchanged

#     Returns a tuple of added, removed and updated
#     """
#     current = {k: current[k] for k in new}
#     d = DeepDiff(current, new, ignore_order=True)
#     added = set()
#     removed = set()
#     changed = d.get("values_changed", dict())
#     for key_change, change in d.get("type_changes", dict()).items():
#         if change["new_value"] == change["old_value"]: # str vs unicode type changes
#             continue
#         else:
#             changed[key_change] = change
#     for key in ["dictionary_item_added", "iterable_item_added", "attribute_added",
#                 "set_item_added"]:
#         added = added.union(d.get(key, set()))
#     for key in ["dictionary_item_removed", "iterable_item_removed", "attribute_removed",
#                 "set_item_removed"]:
#         removed = removed.union(d.get(key, set()))
#     return added, removed, changed
    












    
        # old_value = json.loads(old_record)
        # new_value = json.loads(new_record)
        # print(f"old_value ==> {old_record}")
        # print(f"new_value ==> {new_record}")
        # instance_diff = DeepDiff(old_record, new_record, ignore_order=True)
        # if "values_changed" in instance_diff:
        #     for change in instance_diff["values_changed"]:
        #         field = change.split(".")[-1]
        #         old_val = instance_diff["values_changed"][change]["old_value"]
        #         new_val = instance_diff["values_changed"][change]["new_value"]
        #         print(f"Field '{field}' changed from '{old_val}' to '{new_val}'")
