#!/usr/bin/env python3
# Copyright (c) 2009 Arista Networks, Inc.  All rights reserved.
# Arista Networks, Inc. Confidential and Proprietary.

import optparse # pylint: disable=deprecated-module
import sys

from ExtensionMgr import errors
import ExtensionMgrLib

import PyClient

usage = """
UninstallExtension [-s <sysname>] [-q] <extension-name>

Uninstalls the extension specified by <extension-name>.  The extension must
be installed.
"""

if __name__ == '__main__':
   parser = optparse.OptionParser( usage=usage )
   parser.add_option( "-s", "--sysname", action="store", default="ar",
      help="system name (default: %default)" )
   parser.add_option( "-f", "--force", action="store_true", default=False,
      help="ignore conflicts and dependencies (default: %default)" )
   parser.add_option( "-q", "--quiet", action="store_true", default=False,
      help="suppress output (default: %default)" )
   parser.add_option( "-o", "--output", action="store",
                      default=ExtensionMgrLib.DEFAULT_STATUS_FILE,
                      help="save extension status to file (default %default)" )
   options, args = parser.parse_args()
   if len( args ) != 1:
      parser.error( "No extension name specified" )

   def out( *a, **kw ):
      if not options.quiet:
         sys.stderr.write( *a, **kw )

   extensionName = args[0]
   pc = PyClient.PyClient( options.sysname, "Sysdb" )
   root = pc.agentRoot()
   status = root.entity[ ExtensionMgrLib.statusPath() ]
   info = ExtensionMgrLib.installedExtensionForName( extensionName, status )
   if info is None:
      # pylint: disable-next=consider-using-f-string
      out( "Extension %s is not installed\n" % extensionName )
      sys.exit( 1 )
   try:
      filename = info.filename
      ExtensionMgrLib.updateStatus( status, info.primaryPkg, install=False )
      ExtensionMgrLib.uninstallExtension( info, status, force=options.force )
      config = root.entity[ ExtensionMgrLib.configPath() ]
      ExtensionMgrLib.removeFromConfig( config, filename )
      # save extension to file so Sysdb restart can reload the status
      ExtensionMgrLib.saveInstalledExtensionStatus( root, options.output )
      sys.exit( 0 )
   except errors.Error as e:
      # pylint: disable-next=consider-using-f-string
      out( "Error uninstalling extension: %s\n" % e )
      sys.exit( 1 )
