import decimal
import json
import math

import dictdiffer
from arnparse import arnparse


def table_from_arn(arn: str) -> str:
    arn_ = arnparse(arn)
    return arn_.resource.split('/')[0]


def diff(first: dict, second: dict) -> list[str]:
    result = dictdiffer.diff(first, second)
    changed = []

    for record in result:
        type_, path, _ = record
        if type_ == 'change':
            changed.append(path)

    return changed


class JSONEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, decimal.Decimal):
            if o.is_nan():
                return math.nan

            if o % 1 != 0:
                return float(o.quantize(decimal.Decimal('0.00')))

            return int(o)

        if isinstance(o, set):
            return list(o)

        return super().default(o)
