{ buildPythonPackage
, fetchPypi
, isPy37
, lib

# pythonPackages
, aiohttp
, androguard
, azure-identity
, azure-keyvault
, azure-mgmt-compute
, azure-mgmt-keyvault
, azure-mgmt-network
, azure-mgmt-resource
, azure-mgmt-security
, azure-mgmt-storage
, azure-mgmt-sql
, azure-mgmt-web
, azure-storage
, bandit
, bcrypt
, beautifulsoup4
, boto3
, cfn-flip
, cython
, dnspython
, colorama
, configobj
, defusedxml
, GitPython
, google_api_python_client
, kubernetes
, ldap3
, mixpanel
, mysql-connector
, names
, ntplib
, oyaml
, paramiko
, pillow
, psycopg2
, pycrypto
, pygments
, pyhcl
, pyjks
, pynacl
, pyodbc
, pyopenssl
, pypdf2
, pysmb
, pytesseract
, python_magic
, pytz
, pywinrm
, requirements-detector
, selenium
, tlslite-ng
, viewstate

# pythonPackages to test the derivation
, pytest
, flask
, flask-httpauth
, docker
}:

buildPythonPackage rec {
  pname = "fluidasserts";
  version = "20.2.30165";
  disabled = !isPy37;

  src = fetchPypi {
    inherit pname version;
    sha256 = "0wcplzfx89d3c6hvdgag860sl3infqmymy6ly6y6ah77pkc98x15";
  };

  patchPhase = ''
    # Release packages from their hard pinned versions
    sed -i -E "s/(.*)==.*/\1/g" requirements.txt

    # Functionality that will be not present for the momment
    #   but that we'll work to add in the future
    # Just a minimal portion of fluidasserts use this
    substituteInPlace ./requirements.txt \
      --replace "mitmproxy" "" \

  '';

  propagatedBuildInputs = [
    # pythonPackages
    aiohttp
    androguard
    azure-identity
    azure-keyvault
    azure-mgmt-compute
    azure-mgmt-keyvault
    azure-mgmt-network
    azure-mgmt-resource
    azure-mgmt-security
    azure-mgmt-storage
    azure-mgmt-sql
    azure-mgmt-web
    azure-storage
    bandit
    bcrypt
    beautifulsoup4
    boto3
    cfn-flip
    cython
    dnspython
    colorama
    configobj
    defusedxml
    GitPython
    google_api_python_client
    kubernetes
    ldap3
    mixpanel
    mysql-connector
    names
    ntplib
    oyaml
    paramiko
    pillow
    psycopg2
    pycrypto
    pygments
    pyhcl
    pyjks
    pynacl
    pyodbc
    pyopenssl
    pypdf2
    pysmb
    pytesseract
    python_magic
    pytz
    pywinrm
    requirements-detector
    selenium
    tlslite-ng
    viewstate
  ];

  configurePhase = ''
    mkdir -p build/config
    touch build/config/README.rst
  '';

  checkInputs = [
    docker
    flask
    flask-httpauth
    pytest
  ];

  checkPhase = ''
    # This tests require BWAPP Docker Container
    sed -ie 's/test_a[0-9]//g' ./test/test_proto_http_open.py
    sed -ie 's/test_a[0-9]//g' ./test/test_proto_http_close.py

    # This tests require network connectivity
    sed -ie 's/test_is_date_unsyncd//g' ./test/test_proto_http_open.py
    sed -ie 's/test_is_date_unsyncd//g' ./test/test_proto_http_close.py

    # Remove impurities
    substituteInPlace ./test/conftest.py \
      --replace "import wait" "" \
      --replace "if not os.path.exists(name):" "if os.path.exists(name):" \
      --replace "from test.mock import graphql_server" "" \
      --replace "(graphql_server.start, 'MockGraphQLServer', ['proto_graphql'])," "" \

    pytest --asserts-module 'iot' \
      test/test_iot_phone.py

    pytest --asserts-module 'ot' \
      test/test_ot_powerlogic.py

    pytest --asserts-module 'proto_http' \
      test/test_proto_{http_close,http_open}.py

    pytest --asserts-module 'proto_rest' \
      test/test_proto_rest.py

    # This file launches mock docker containers and servers
    #   let's remove it to create a custom test environment
    rm test/conftest.py

    pytest \
      test/test_cloud_aws_terraform_{cloudfront,dynamodb,ebs,ec2,elb}.py \
      test/test_cloud_aws_terraform_{fsx,iam,kms,rds,s3}.py \
      test/test_cloud_aws_cloudformation_{cloudfront,dynamodb,ec2,elb,elb2}.py \
      test/test_cloud_aws_cloudformation_{fsx,iam,kms,rds,s3,secretsmanager}.py \
      test/test_format_{apk,jks,jwt,pdf,pkcs12,string}.py \
      test/test_helper_{asynchronous,crypto}.py \
      test/test_lang_{javascript,java}.py \
      test/test_lang_{core,csharp,docker,dotnetconfig,html,php,python,rpgle}.py \
      test/test_utils_generic.py
  '';

  meta = with lib; {
    description = "Assertion Library for Security Assumptions";
    homepage = "https://gitlab.com/fluidattacks/asserts";
    license = licenses.mpl20;
    maintainers = with maintainers; [
      kamadorueda
    ];
    broken = true; # dependency tree is too fragile for nixpkgs
  };
}
