import sys
import os
import grpc
import pytest
import tempfile

sys.path.insert(1, os.path.join(sys.path[0], '../../'))
import rips

import dataroot


def test_10kAsync(rips_instance, initialize_test):
    casePath = dataroot.PATH + "/TEST10K_FLT_LGR_NNC/TEST10K_FLT_LGR_NNC.EGRID"
    case = rips_instance.project.load_case(path=casePath)

    resultChunks = case.active_cell_property_async('DYNAMIC_NATIVE', 'SOIL', 1)
    mysum = 0.0
    count = 0
    for chunk in resultChunks:
        mysum += sum(chunk.values)
        count += len(chunk.values)
    average = mysum / count
    assert(mysum == pytest.approx(621.768, abs=0.001))
    assert(average != pytest.approx(0.0158893, abs=0.0000001))
    assert(average == pytest.approx(0.0558893, abs=0.0000001))


def test_10kSync(rips_instance, initialize_test):
    casePath = dataroot.PATH + "/TEST10K_FLT_LGR_NNC/TEST10K_FLT_LGR_NNC.EGRID"
    case = rips_instance.project.load_case(path=casePath)

    results = case.active_cell_property('DYNAMIC_NATIVE', 'SOIL', 1)
    mysum = sum(results)
    average = mysum / len(results)
    assert(mysum == pytest.approx(621.768, abs=0.001))
    assert(average != pytest.approx(0.0158893, abs=0.0000001))
    assert(average == pytest.approx(0.0558893, abs=0.0000001))


def test_10k_set(rips_instance, initialize_test):
    casePath = dataroot.PATH + "/TEST10K_FLT_LGR_NNC/TEST10K_FLT_LGR_NNC.EGRID"
    case = rips_instance.project.load_case(path=casePath)

    results = case.active_cell_property('DYNAMIC_NATIVE', 'SOIL', 1)
    case.set_active_cell_property(results, 'GENERATED', 'SOIL', 1)


def test_10k_set_out_of_bounds(rips_instance, initialize_test):
    casePath = dataroot.PATH + "/TEST10K_FLT_LGR_NNC/TEST10K_FLT_LGR_NNC.EGRID"
    case = rips_instance.project.load_case(path=casePath)

    results = case.active_cell_property('DYNAMIC_NATIVE', 'SOIL', 1)
    results.append(5.0)
    with pytest.raises(grpc.RpcError):
        assert case.set_active_cell_property(results, 'GENERATED', 'SOIL', 1)


def test_10k_set_out_of_bounds_client(rips_instance, initialize_test):
    casePath = dataroot.PATH + "/TEST10K_FLT_LGR_NNC/TEST10K_FLT_LGR_NNC.EGRID"
    case = rips_instance.project.load_case(path=casePath)

    results = case.active_cell_property('DYNAMIC_NATIVE', 'SOIL', 1)
    case.chunk_size = len(results)
    results.append(5.0)
    with pytest.raises(IndexError):
        assert case.set_active_cell_property(results, 'GENERATED', 'SOIL', 1)


def createResult(poroChunks, permxChunks):
    for (poroChunk, permxChunk) in zip(poroChunks, permxChunks):
        resultChunk = []
        for (poro, permx) in zip(poroChunk.values, permxChunk.values):
            resultChunk.append(poro * permx)
        yield resultChunk


def checkResults(poroValues, permxValues, poropermxValues):
    for (poro, permx, poropermx) in zip(poroValues, permxValues, poropermxValues):
        recalc = poro * permx
        assert(recalc == pytest.approx(poropermx, rel=1.0e-10))


def test_10k_PoroPermX(rips_instance, initialize_test):
    casePath = dataroot.PATH + "/TEST10K_FLT_LGR_NNC/TEST10K_FLT_LGR_NNC.EGRID"
    case = rips_instance.project.load_case(path=casePath)

    poroChunks = case.active_cell_property_async('STATIC_NATIVE', 'PORO', 0)
    permxChunks = case.active_cell_property_async('STATIC_NATIVE', 'PERMX', 0)

    case.set_active_cell_property_async(createResult(
        poroChunks, permxChunks), 'GENERATED', 'POROPERMXAS', 0)

    poro = case.active_cell_property('STATIC_NATIVE', 'PORO', 0)
    permx = case.active_cell_property('STATIC_NATIVE', 'PERMX', 0)
    poroPermX = case.active_cell_property('GENERATED', 'POROPERMXAS', 0)

    checkResults(poro, permx, poroPermX)


def test_exportPropertyInView(rips_instance, initialize_test):
    case_path = dataroot.PATH + "/TEST10K_FLT_LGR_NNC/TEST10K_FLT_LGR_NNC.EGRID"
    rips_instance.project.load_case(case_path)
    with tempfile.TemporaryDirectory(prefix="rips") as tmpdirname:
        print("Temporary folder: ", tmpdirname)
        rips_instance.set_export_folder(export_type='PROPERTIES', path=tmpdirname)
        case = rips_instance.project.cases()[0]
        view = case.views()[0]
        view.export_property()
        expected_file_name = case.name + "-" + str("3D_View") + "-" + "T0" + "-SOIL"
        full_path = tmpdirname + "/" + expected_file_name
        assert(os.path.exists(full_path))
