#!/usr/bin/python
# PYTHON_ARGCOMPLETE_OK

import sys
import argparse, argcomplete
import json
import openaps

from openaps import cli
from openaps.devices import Device
from openaps.reports import Report
from openaps.vendors import Vendor
from openaps.alias import Alias
from openaps import uses
class ImportToolApp (cli.ConfigApp):
  """ openaps-import - import openaps configuration
  Import configuration.

  Example workflow:


  openaps -C /path/to/another/openaps.ini device show --json ns-upload | openaps import -
  """

  name = 'import'
  MAP = dict(vendor=Vendor, device=Device, report=Report, alias=Alias)
  def configure_parser (self, parser):
    self.read_config( )
    # parser.add_argument('--ini')
    # parser.add_argument('--json')
    parser.add_argument('input', default='-', nargs='?', type=argparse.FileType('r'), help="Read from stdin  ")

  def prolog (self):
    super(ImportToolApp, self).prolog( )

  def epilog (self):
    super(ImportToolApp, self).epilog( )

  def Make (self, configurable):
    Configurable = self.MAP.get(configurable.get('type'), None)
    if not Configurable:
      print "UNKNOWN TYPE", configurable.get('type')
      print configurable
      raise Exception("UNKNOWN TYPE %s" % configurable.get('type'))
    name = configurable.get('name')
    required = [ name ]
    core = configurable.get(name)
    for field in Configurable.required:
      if field != 'name':
        required.append(configurable.get(field, core.get(field)))

    inst = Configurable.FromImport(configurable, self.config)
    # inst = Configurable(*required)
    extra = configurable.get('extra', {})
    if hasattr(inst, 'extra'):
      inst.extra.fields = extra
    return inst
  def run (self, args):
    # print self.inputs
    candidates = json.load(args.input)
    if not isinstance(candidates, list):
      candidates = [ candidates ]
    for candidate in candidates:
      incoming = self.Make(candidate)
      incoming.store(self.config)
      self.config.save( )
      print incoming.format_url( )

if __name__ == '__main__':

    app = ImportToolApp(sys.argv)
    app( )

