#  Copyright (c) ZenML GmbH 2021. All Rights Reserved.
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at:
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
#  or implied. See the License for the specific language governing
#  permissions and limitations under the License.

import os
from typing import List, Text

import click

from zenml.cli.cli import cli
from zenml.utils import path_utils


def get_examples_dir() -> Text:
    """Return the examples dir."""
    cli_dir = os.path.dirname(__file__)
    package_dir = os.path.dirname(os.path.dirname(cli_dir))
    examples_dir = os.path.join(package_dir, "examples")
    return examples_dir


def get_all_examples() -> List[Text]:
    """Get all the examples"""
    examples = []
    for name in sorted(os.listdir(get_examples_dir())):
        # Skip hidden files (like .gitignore)
        if (
            not name.startswith(".")
            and not name.startswith("__")
            and not name.startswith("README")
        ):
            examples.append(name)
    return examples


def get_example_readme(example_path) -> Text:
    """Get the example README file contents."""
    with open(os.path.join(example_path, "README.md")) as readme:
        readme_content = readme.read()
    return readme_content


@cli.group(help="Access all ZenML examples.")
def example():
    """Examples group"""


@example.command(help="List the available examples.")
def list():
    """List all available examples."""
    click.echo("Listing examples: \n")
    for name in get_all_examples():
        click.echo(f"{name}")
    click.echo("\nTo pull the examples, type: ")
    click.echo("zenml example pull EXAMPLE_NAME")


@example.command(help="Find out more about an example.")
@click.argument("example_name")
def info(example_name):
    """Find out more about an example."""
    example_dir = os.path.join(get_examples_dir(), example_name)
    readme_content = get_example_readme(example_dir)
    click.echo(readme_content)


@example.command(
    help="Pull examples straight " "into your current working directory."
)
@click.argument("example_name", required=False, default=None)
def pull(example_name):
    """Pull examples straight " "into your current working directory."""
    examples_dir = get_examples_dir()
    if not example_name:
        examples = get_all_examples()
    else:
        examples = [example_name]

    # Create destination dir.
    dst = os.path.join(os.getcwd(), "zenml_examples")
    path_utils.create_dir_if_not_exists(dst)

    # Pull specified examples.
    for example in examples:
        dst_dir = os.path.join(dst, example)
        # Check if example has already been pulled before.
        if path_utils.file_exists(dst_dir):
            if click.confirm(
                f"Example {example} is already pulled. "
                f"Do you wish to overwrite the directory?"
            ):
                path_utils.rm_dir(dst_dir)
            else:
                continue
        click.echo(f"Pulling example {example}")
        src_dir = os.path.join(examples_dir, example)
        path_utils.copy_dir(src_dir, dst_dir)

        click.echo(f"Example pulled in directory: {dst_dir}")

    click.echo()
    click.echo(
        "Please read the README.md file in the respective example "
        "directory to find out more about the example"
    )
