"""Migrate signals from old style to new style
"""
# Author: Juergen E. Fischer

# .connect( sender, signal, receiver, slot )

# Local imports
from lib2to3 import fixer_base, pytree
from lib2to3.fixer_util import Call, Name, Attr, ArgList, Node, syms

import re


class FixSignals(fixer_base.BaseFix):
    PATTERN = """
  (
  power<
    any trailer< '.' method=('connect'|'disconnect') >
    trailer<
      '('
      arglist<
        sender=any ','
        power< 'SIGNAL' trailer< '(' signal=any ')' > > ','
        slot=any
      >
      ')'
    >
  >
  |
  power<
    emitter=any trailer< '.' 'emit' >
    trailer<
      '('
        args=arglist<
            power< 'SIGNAL' trailer< '(' signal=any ')' > >
            ( ',' any )*
        >
      ')'
    >
  >
  |
  power<
    emitter=any trailer< '.' 'emit' >
    trailer<
      '('
        args=power< 'SIGNAL' trailer< '(' signal=any ')' > >
      ')'
    >
  >
  )
"""

#    def match(self, node):
#        res = super(FixSignals, self).match( node )
#        r = repr(node)
#        if "emit" in r:
#            print "yes" if res else "no", ": ", r
#        return res

    def transform(self, node, results):
        signal = results.get("signal").value
        signal = re.sub('^["\']([^(]+)(?:\(.*\))?["\']$', '\\1', signal)

        if 'emitter' in results:
            emitter = results.get("emitter").clone()
            emitter.prefix = node.prefix
            args = results.get("args").clone()
            args.children = args.children[2:]
            if args.children:
                args.children[0].prefix = ''
            res = Node(syms.power, [emitter, Name('.'), Name(signal), Name('.'), Name('emit')] + [ArgList([args])])
        else:
            sender = results.get("sender").clone()
            method = results.get("method")
            if isinstance(method, list):
                method = method[0]
            method = method.clone()
            sender.prefix = node.prefix
            slot = results.get("slot").clone()
            slot.prefix = ""
            res = Node(syms.power, [sender, Name('.'), Name(signal), Name('.'), method] + [ArgList([slot])])
        return res