from __future__ import print_function as _

import os as _os
import sys as _sys
import json

import dash as _dash

# noinspection PyUnresolvedReferences
from ._imports_ import *
from ._imports_ import __all__
from . import utils


if not hasattr(_dash, '__plotly_dash') and not hasattr(_dash, 'development'):
    print('Dash was not successfully imported. '
          'Make sure you don\'t have a file '
          'named \n"dash.py" in your current directory.', file=_sys.stderr)
    _sys.exit(1)

_basepath = _os.path.dirname(__file__)
_filepath = _os.path.abspath(_os.path.join(_basepath, 'package.json'))
with open(_filepath) as f:
    package = json.load(f)

package_name = package['name'].replace(' ', '_').replace('-', '_')
__version__ = package['version']

_current_path = _os.path.dirname(_os.path.abspath(__file__))

_this_module = _sys.modules[__name__]


_js_dist = [
    {
        'relative_package_path': 'dash_cytoscape.min.js',
        'dev_package_path': 'dash_cytoscape.dev.js',
        'external_url': 'https://unpkg.com/dash-cytoscape@{2}/{1}/{1}.min.js'.format(
            package_name, __name__, __version__),
        'namespace': package_name
    }
]

_css_dist = []


for _component in __all__:
    setattr(locals()[_component], '_js_dist', _js_dist)
    setattr(locals()[_component], '_css_dist', _css_dist)


def load_extra_layouts():
    """
    Load 3rd party layouts that are not included by default with Cytoscape. You can find the
    documentation about those layouts here:
        - `cose-bilkent`: https://github.com/cytoscape/cytoscape.js-cose-bilkent
        - `cola`: https://github.com/cytoscape/cytoscape.js-cola
        - `euler`: https://github.com/cytoscape/cytoscape.js-dagre
        - `spread`: https://github.com/cytoscape/cytoscape.js-spread
        - `dagre`: https://github.com/cytoscape/cytoscape.js-dagre
        - `klay`: https://github.com/cytoscape/cytoscape.js-klay

    Example:

    ```
    import dash
    import dash_html_components as html
    import dash_cytoscape as cyto

    cyto.load_extra_layouts()

    app = dash.Dash(__name__)

    app.layout = html.Div([
        cyto.Cytoscape(...),
    ])
    ```

    Be careful about using the extra layouts when not necessary, since they require supplementary
    bandwidth for loading, which impacts the startup time of the app.
    """
    global _js_dist

    _js_dist = [
        {
            'relative_package_path': 'dash_cytoscape_extra.min.js',
            'dev_package_path': 'dash_cytoscape_extra.dev.js',
            'external_url': 'https://unpkg.com/dash-cytoscape@{}/{}/{}.min.js'.format(
                __version__, __name__, 'dash_cytoscape_extra'
            ),
            'namespace': package_name
        }
    ]


def _display_default_values():
    out_string = ""

    metadata_path = _os.path.join(
        _os.path.dirname(_os.path.realpath(__file__)),
        'metadata.json'
    )

    with open(metadata_path, 'r') as file:
        data = json.loads(file.read())

    for component in data:
        component_name = component.replace('src/lib/components/', '').replace('.react.js', '')
        metadata = data[component]
        props = metadata['props']

        out_string += "## {} Default Values\n\n".format(component_name)

        for prop_name in props:
            prop = props[prop_name]

            if 'defaultValue' in prop:
                default = prop['defaultValue']['value']

                out_string += "* *{}*: {}\n".format(prop_name, default)

    return out_string
