# -*- coding: utf-8 -*-
"""
    wakatime.dependencies.java
    ~~~~~~~~~~~~~~~~~~~~~~~~~~

    Parse dependencies from Java code.

    :copyright: (c) 2014 Alan Hamlett.
    :license: BSD, see LICENSE for more details.
"""

from . import TokenParser
from ..compat import u


class JavaParser(TokenParser):
    exclude = [
        r'^java\.',
        r'^javax\.',
        r'^import$',
        r'^package$',
        r'^namespace$',
        r'^static$',
    ]
    state = None
    buffer = u('')

    def parse(self):
        for index, token, content in self.tokens:
            self._process_token(token, content)
        return self.dependencies

    def _process_token(self, token, content):
        if self.partial(token) == 'Namespace':
            self._process_namespace(token, content)
        if self.partial(token) == 'Name':
            self._process_name(token, content)
        elif self.partial(token) == 'Attribute':
            self._process_attribute(token, content)
        elif self.partial(token) == 'Operator':
            self._process_operator(token, content)
        elif self.partial(token) == 'Punctuation':
            self._process_operator(token, content)
        else:
            self._process_other(token, content)

    def _process_namespace(self, token, content):
        if u(content).split() and u(content).split()[0] == u('import'):
            self.state = 'import'

        elif self.state == 'import':
            keywords = [
                u('package'),
                u('namespace'),
                u('static'),
            ]
            if u(content) in keywords:
                return
            self.buffer = u('{0}{1}').format(self.buffer, u(content))

        elif self.state == 'import-finished':
            content = content.split(u('.'))

            if len(content) == 1:
                self.append(content[0])

            elif len(content) > 1:
                if len(content[0]) == 3:
                    content = content[1:]
                if content[-1] == u('*'):
                    content = content[:len(content) - 1]

                if len(content) == 1:
                    self.append(content[0])
                elif len(content) > 1:
                    self.append(u('.').join(content[:2]))

            self.state = None

    def _process_name(self, token, content):
        if self.state == 'import':
            self.buffer = u('{0}{1}').format(self.buffer, u(content))

    def _process_attribute(self, token, content):
        if self.state == 'import':
            self.buffer = u('{0}{1}').format(self.buffer, u(content))

    def _process_operator(self, token, content):
        if u(content) == u(';'):
            self.state = 'import-finished'
            self._process_namespace(token, self.buffer)
            self.state = None
            self.buffer = u('')
        elif self.state == 'import':
            self.buffer = u('{0}{1}').format(self.buffer, u(content))

    def _process_other(self, token, content):
        pass


class KotlinParser(TokenParser):
    state = None
    exclude = [
        r'^java\.',
    ]

    def parse(self):
        for index, token, content in self.tokens:
            self._process_token(token, content)
        return self.dependencies

    def _process_token(self, token, content):
        if self.partial(token) == 'Keyword':
            self._process_keyword(token, content)
        elif self.partial(token) == 'Text':
            self._process_text(token, content)
        elif self.partial(token) == 'Namespace':
            self._process_namespace(token, content)
        else:
            self._process_other(token, content)

    def _process_keyword(self, token, content):
        self.state = content

    def _process_text(self, token, content):
        pass

    def _process_namespace(self, token, content):
        if self.state == 'import':
            self.append(self._format(content))
        self.state = None

    def _process_other(self, token, content):
        self.state = None

    def _format(self, content):
        content = content.split(u('.'))

        if content[-1] == u('*'):
            content = content[:len(content) - 1]

        if len(content) == 0:
            return None

        if len(content) == 1:
            return content[0]

        return u('.').join(content[:2])


class ScalaParser(TokenParser):
    state = None

    def parse(self):
        for index, token, content in self.tokens:
            self._process_token(token, content)
        return self.dependencies

    def _process_token(self, token, content):
        if self.partial(token) == 'Keyword':
            self._process_keyword(token, content)
        elif self.partial(token) == 'Text':
            self._process_text(token, content)
        elif self.partial(token) == 'Namespace':
            self._process_namespace(token, content)
        else:
            self._process_other(token, content)

    def _process_keyword(self, token, content):
        self.state = content

    def _process_text(self, token, content):
        pass

    def _process_namespace(self, token, content):
        if self.state == 'import':
            self.append(self._format(content))
        self.state = None

    def _process_other(self, token, content):
        self.state = None

    def _format(self, content):
        return content.strip().lstrip('__root__').strip('_').strip('.')
