"""
Restic commands
"""
import logging
from typing import List, Tuple
from subprocess import Popen, PIPE
from restic_compose_backup import commands

logger = logging.getLogger(__name__)


def init_repo(repository: str):
    """
    Attempt to initialize the repository.
    Doing this after the repository is initialized
    """
    return commands.run(restic(repository, [
        "init",
    ]))


def backup_files(repository: str, source='/volumes'):
    return commands.run(restic(repository, [
        "--verbose",
        "backup",
        source,
    ]))


def backup_from_stdin(repository: str, filename: str, source_command: List[str]):
    """
    Backs up from stdin running the source_command passed in.
    It will appear in restic with the filename (including path) passed in.
    """
    dest_command = restic(repository, [
        'backup',
        '--stdin',
        '--stdin-filename',
        filename,
    ])

    # pipe source command into dest command
    # NOTE: Using the default buffer size: io.DEFAULT_BUFFER_SIZE = 8192
    #       We might want to tweak that to speed up large dumps.
    #       Actual tests tests must be done.
    source_process = Popen(source_command, stdout=PIPE)
    dest_process = Popen(dest_command, stdin=source_process.stdout, stdout=PIPE, stderr=PIPE)
    stdout, stderr = dest_process.communicate()

    if stdout:
        for line in stdout.decode().split('\n'):
            logger.debug(line)

    if stderr:
        for line in stderr.decode().split('\n'):
            logger.error(line)

    # Ensure both processes exited with code 0
    source_exit, dest_exit = source_process.poll(), dest_process.poll()
    return 0 if (source_exit == 0 and dest_exit == 0) else 1


def snapshots(repository: str, last=True) -> Tuple[str, str]:
    args = ["snapshots"]
    if last:
        args.append('--last')        
    return commands.run_capture_std(restic(repository, args))


def forget(repository: str, daily: str, weekly: str, monthly: str, yearly: str):
    return restic(repository, [
        'forget',
        '--keep-daily',
        daily,
        '--keep-weekly',
        weekly,
        '--keep-monthly',
        monthly,
        '--keep-yearly',
        yearly,
    ])


def prune(repository: str):
    return restic(repository, [
        'prune',
    ])


def check(repository: str):
    return commands.run(restic(repository, [
        "check",
    ]))


def restic(repository: str, args: List[str]):
    """Generate restic command"""
    return [
        "restic",
        "-r",
        repository,
    ] + args