import pydicom # https://github.com/pydicom/pydicom, sudo python3 -m pip install pydicom
from pynetdicom import AE, evt, AllStoragePresentationContexts, build_context, debug_logger  #  sudo python3 -m pip install pynetdicom, https://github.com/pydicom/pynetdicom
from pynetdicom.sop_class import ModalityPerformedProcedureStepSOPClass, CTImageStorage, MRImageStorage
from pydicom.dataset import Dataset


managed_instances = {}
#debug_logger()
# Implement the evt.EVT_N_CREATE handler
def handle_create(event):
    # MPPS' N-CREATE request must have an *Affected SOP Instance UID*
    print("In Pynet Dicom, N-CREATE")
    req = event.request
    print(req.AffectedSOPInstanceUID)
    if req.AffectedSOPInstanceUID is None:
        # Failed - invalid attribute value
        print("Returning 0x0106, No AffectedSOPInstanceUID")
        return 0x0106, None
    # Can't create a duplicate SOP Instance
    if req.AffectedSOPInstanceUID in managed_instances:
        # Failed - duplicate SOP Instance
        print("returning 0x0111, duplicate SOP Instance")
        return 0x0111, None

    # The N-CREATE request's *Attribute List* dataset
    attr_list = event.attribute_list

    # Performed Procedure Step Status must be 'IN PROGRESS'
    if "PerformedProcedureStepStatus" not in attr_list:
        # Failed - missing attribute
        print("returning 0x0120, PerformedProcedureStepStatus not in Attribute List")
        return 0x0120, None
    if attr_list.PerformedProcedureStepStatus.upper() != 'IN PROGRESS':
        print("returning 0x0106, Not IN PROGRESS")
        return 0x0106, None

    # Skip other tests...

    # Create a Modality Performed Procedure Step SOP Class Instance
    #   DICOM Standard, Part 3, Annex B.17
    print("Getting DataSet")
    ds = Dataset()
    print("Setting SOP UIDs")
    # Add the SOP Common module elements (Annex C.12.1)
    ds.SOPClassUID = ModalityPerformedProcedureStepSOPClass
    ds.SOPInstanceUID = req.AffectedSOPInstanceUID
    print("Updating Attributes")
    # Update with the requested attributes
    ds.update(attr_list)
    
    # Add the dataset to the managed SOP Instances
    managed_instances[ds.SOPInstanceUID] = ds
    print("Returned 0x0000 and DataSet")
    print (ds)
    # Return status, dataset
    return 0x0000, ds

# Implement the evt.EVT_N_SET handler
def handle_set(event):
    req = event.request
    if req.RequestedSOPInstanceUID not in managed_instances:
        # Failure - SOP Instance not recognised
        return 0x0112, None

    ds = managed_instances[req.RequestedSOPInstanceUID]

    # The N-SET request's *Modification List* dataset
    mod_list = event.attribute_list

    # Skip other tests...

    ds.update(mod_list)

    # Return status, dataset
    return 0x0000, ds

handlers = [(evt.EVT_N_CREATE, handle_create), (evt.EVT_N_SET, handle_set)]

# Initialise the Application Entity and specify the listen port
ae = AE()

# Add the supported presentation context
ae.add_supported_context(ModalityPerformedProcedureStepSOPClass)

# Start listening for incoming association requests
ae.start_server(('', 11112), block=False, evt_handlers=handlers)
