from __future__ import print_function, absolute_import

import re
import logging

import numpy as np

from ...utils import int_else_float_except_string

logging.basicConfig()
logger = logging.getLogger(__file__)


def find_name(string):
    return re.search('function\s*mpc\s*=\s*(?P<data>.*?)\n', string).groupdict()['data']


def find_attributes(string):
    pattern = 'mpc\.(?P<attribute>.*?)\s*=\s*'
    return re.findall(pattern, string, re.DOTALL)


def parse_file(attribute, string):

    match = search_file(attribute, string)

    if match is not None:
        match = match.strip("'").strip('"')
        _list = list()
        for line in match.splitlines():
            line = line.split('%')[0]
            line = line.replace(';', '')
            if line.strip():
                if attribute == 'bus_name':
                    _list.append([line.strip().strip("'")])
                else:
                    _list.append([int_else_float_except_string(s) for s in line.strip().split()])

        return _list
    else:
        return match


def search_file(attribute, string):

    if attribute in ['gen', 'gencost', 'bus', 'branch']:
        pattern = r'mpc\.{}\s*=\s*\[[\n]?(?P<data>.*?)[\n]?\];'.format(attribute)
    elif attribute in ['version', 'baseMVA']:
        pattern = r'mpc\.{}\s*=\s*(?P<data>.*?);'.format(attribute)
    elif attribute == 'bus_name':
        pattern = r'mpc\.{}\s*=\s*\{{[\n]?(?P<data>.*?)[\n]?\}};'.format('bus_name')
    else:
        logger.warning('Unable to parse mpc.%s. Please contact the developer.', attribute)
        return None

    match = re.search(pattern, string, re.DOTALL)
    if match is not None:
        return match.groupdict().get('data', None)
    else:
        return match