###################################################################
# This example demonstrates the use of ResInsight exceptions
# for proper error handling
###################################################################

import rips
import grpc
import tempfile

resinsight = rips.Instance.find()

case = None

# Try loading a non-existing case. We should get a grpc.RpcError exception from the server
try:
    case = resinsight.project.load_case("Nonsense")
except grpc.RpcError as e:
    print(
        "Expected Server Exception Received while loading case: ", e.code(), e.details()
    )

# Try loading well paths from a non-existing folder.  We should get a grpc.RpcError exception from the server
try:
    well_path_files = resinsight.project.import_well_paths(
        well_path_folder="NONSENSE/NONSENSE"
    )
except grpc.RpcError as e:
    print(
        "Expected Server Exception Received while loading wellpaths: ",
        e.code(),
        e.details(),
    )

# Try loading well paths from an existing but empty folder. We should get a warning.
try:
    with tempfile.TemporaryDirectory() as tmpdirname:
        well_path_files = resinsight.project.import_well_paths(
            well_path_folder=tmpdirname
        )
        assert len(well_path_files) == 0
        assert resinsight.project.has_warnings()
        print("Should get warnings below")
        for warning in resinsight.project.warnings():
            print(warning)
except grpc.RpcError as e:
    print("Unexpected Server Exception caught!!!", e)

case = resinsight.project.case(case_id=0)
if case is not None:
    results = case.active_cell_property("STATIC_NATIVE", "PORO", 0)
    active_cell_count = len(results)

    # Send the results back to ResInsight inside try / except construct
    try:
        case.set_active_cell_property(results, "GENERATED", "POROAPPENDED", 0)
        print("Everything went well as expected")
    except:  # Match any exception, but it should not happen
        print("Ooops!")

    # Add another value, so this is outside the bounds of the active cell result storage
    results.append(1.0)

    # This time we should get a grpc.RpcError exception, which is a server side error.
    try:
        case.set_active_cell_property(results, "GENERATED", "POROAPPENDED", 0)
        print("Everything went well??")
    except grpc.RpcError as e:
        print("Expected Server Exception Received: ", e)
    except IndexError:
        print("Got index out of bounds error. This shouldn't happen here")

    # With a chunk size exactly matching the active cell count the server will not
    # be able to see any error as it will successfully close the stream after receiving
    # the correct number of values, even if the python client has more chunks to send
    case.chunk_size = active_cell_count

    try:
        case.set_active_cell_property(results, "GENERATED", "POROAPPENDED", 0)
        print("Everything went well??")
    except grpc.RpcError as e:
        print("Got unexpected server exception", e, "This should not happen now")
    except IndexError:
        print("Got expected index out of bounds error on client side")
