"""default tests"""

from pathlib import Path
from textwrap import dedent

import boto3
from rwm import is_sublist, main as rwm_main, rclone_obscure_password, RWM


def buckets_plain_list(full_response):
    """boto3 helper"""

    return [x["Name"] for x in full_response["Buckets"]]


def objects_plain_list(full_response):
    """boto3 helper"""

    return [x["Key"] for x in full_response["Contents"]]


def test_sublist():
    """test sublist"""

    assert is_sublist([], [])
    assert is_sublist([1, 2, 3], [5, 4, 1, 2, 3, 6, 7])
    assert not is_sublist([1, 3], [5, 4, 1, 2, 3, 6, 7])


def test_main(tmpworkdir: str):  # pylint: disable=unused-argument
    """test main"""

    assert rwm_main([]) == 0

    Path("rwm.conf").write_text(
        dedent("""
            S3_ENDPOINT_URL: "dummy"
            S3_ACCESS_KEY: "dummy"
            S3_SECRET_KEY: "dummy"

            RCC_CRYPT_BUCKET: "dummy-nasbackup-test1"
            RCC_CRYPT_PASSWORD: "dummy"

            RES_BUCKET: "dummy"
            RES_PASSWORD: "dummy"
        """),
        encoding="utf-8"
    )

    assert rwm_main([]) == 0

    assert rwm_main(["aws", "--", "--version"]) == 0
    assert rwm_main(["aws", "notexist"]) != 0

    assert rwm_main(["rclone", "version"]) == 0
    assert rwm_main(["rclone_crypt", "version"]) == 0

    assert rwm_main(["restic", "version"]) == 0


def test_aws_cmd(tmpworkdir: str, motoserver: str):  # pylint: disable=unused-argument
    """test aws command"""

    rwm = RWM({
        "S3_ENDPOINT_URL": motoserver,
        "S3_ACCESS_KEY": "dummy",
        "S3_SECRET_KEY": "dummy",
    })
    s3 = boto3.client('s3', endpoint_url=motoserver, aws_access_key_id="dummy", aws_secret_access_key="dummy")
    test_bucket = "testbucket"

    assert test_bucket not in buckets_plain_list(s3.list_buckets())

    rwm.aws_cmd(["s3", "mb", f"s3://{test_bucket}"])
    assert test_bucket in buckets_plain_list(s3.list_buckets())

    rwm.aws_cmd(["s3", "rb", f"s3://{test_bucket}"])
    assert test_bucket not in buckets_plain_list(s3.list_buckets())


def test_rclone_cmd(tmpworkdir: str, motoserver: str):  # pylint: disable=unused-argument
    """test rclone command"""

    rwm = RWM({
        "S3_ENDPOINT_URL": motoserver,
        "S3_ACCESS_KEY": "dummy",
        "S3_SECRET_KEY": "dummy",
    })
    s3 = boto3.client('s3', endpoint_url=motoserver, aws_access_key_id="dummy", aws_secret_access_key="dummy")

    test_bucket = "testbucket"
    test_file = "testfile.txt"
    Path(test_file).write_text('1234', encoding='utf-8')

    rwm.rclone_cmd(["mkdir", f"rwmbe:/{test_bucket}/"])
    rwm.rclone_cmd(["copy", test_file, f"rwmbe:/{test_bucket}/"])
    assert test_bucket in buckets_plain_list(s3.list_buckets())
    assert test_file in objects_plain_list(s3.list_objects_v2(Bucket=test_bucket))


def test_rclone_crypt_cmd(tmpworkdir: str, motoserver: str):  # pylint: disable=unused-argument
    """test rclone with crypt overlay"""

    rwm = RWM({
        "S3_ENDPOINT_URL": motoserver,
        "S3_ACCESS_KEY": "dummy",
        "S3_SECRET_KEY": "dummy",
        "RCC_CRYPT_BUCKET": "cryptdata_test",
        "RCC_CRYPT_PASSWORD": rclone_obscure_password("dummydummydummydummydummydummydummydummy"),
    })
    s3 = boto3.client('s3', endpoint_url=motoserver, aws_access_key_id="dummy", aws_secret_access_key="dummy")

    test_bucket = "testbucket"
    test_file = "testfile.txt"
    Path(test_file).write_text('1234', encoding='utf-8')

    rwm.rclone_crypt_cmd(["copy", test_file, f"rwmbe:/{test_bucket}/"])
    assert len(objects_plain_list(s3.list_objects_v2(Bucket=rwm.config["RCC_CRYPT_BUCKET"]))) == 1

    rwm.rclone_crypt_cmd(["delete", f"rwmbe:/{test_bucket}/{test_file}"])
    assert s3.list_objects_v2(Bucket=rwm.config["RCC_CRYPT_BUCKET"])["KeyCount"] == 0

    test_file1 = "testfile1.txt"
    Path(test_file1).write_text('4321', encoding='utf-8')
    rwm.rclone_crypt_cmd(["sync", ".", f"rwmbe:/{test_bucket}/"])
    assert s3.list_objects_v2(Bucket=rwm.config["RCC_CRYPT_BUCKET"])["KeyCount"] == 2

    Path(test_file1).unlink()
    rwm.rclone_crypt_cmd(["sync", ".", f"rwmbe:/{test_bucket}/"])
    assert s3.list_objects_v2(Bucket=rwm.config["RCC_CRYPT_BUCKET"])["KeyCount"] == 1


# def test_restic_cmd(tmpworkdir: str, motoserver: str):  # pylint: disable=unused-argument
#    """test rclone with crypt overlay"""
#
#    rwm_conf = {
#        "S3_ENDPOINT_URL": motoserver,
#        "S3_ACCESS_KEY": "dummy",
#        "S3_SECRET_KEY": "dummy",
#        "RES_BUCKET": "restic_test",
#        "RES_PASSWORD": "dummydummydummydummydummydummydummydummy",
#    }
#    s3 = boto3.client('s3', endpoint_url=motoserver, aws_access_key_id="dummy", aws_secret_access_key="dummy")
#
#    test_bucket = "testbucket"
#    test_file = "testfile.txt"
#    Path(test_file).write_text('1234', encoding='utf-8')
#
#    rwm_main(["res", "init"], rwm_conf)
#    assert len(objects_plain_list(s3.list_objects_v2(Bucket=rwm_conf["RES_BUCKET"]))) == 1


#
#    rwm_main(["rcc", "delete", f"rwmbe:/{test_bucket}/{test_file}"], rwm_conf)
#    assert s3.list_objects_v2(Bucket=rwm_conf["RCC_CRYPT_BUCKET"])["KeyCount"] == 0
#
#    test_file1 = "testfile1.txt"
#    Path(test_file1).write_text('4321', encoding='utf-8')
#    rwm_main(["rcc", "sync", ".", f"rwmbe:/{test_bucket}/"], rwm_conf)
#    assert s3.list_objects_v2(Bucket=rwm_conf["RCC_CRYPT_BUCKET"])["KeyCount"] == 2
#
#    Path(test_file1).unlink()
#    rwm_main(["rcc", "sync", ".", f"rwmbe:/{test_bucket}/"], rwm_conf)
#    assert s3.list_objects_v2(Bucket=rwm_conf["RCC_CRYPT_BUCKET"])["KeyCount"] == 1