#!/usr/bin/python -S

"""Functions related to persisting command line options."""

import ast
import errno
import os

import utils


def save_options(program, band, argv, tmp=False):
  """Saves program options.

  Persistence options are stripped before saving to prevent rewriting identical
  options when they are loaded and run.

  Args:
    program: The program for which to save options.
    band: The band for which to save options.
    argv: The options to save.
    tmp: Whether to save options to /tmp or _CONFIG_DIR.
  """
  to_save = {
      'argv': [arg for arg in argv if arg not in ('-P', '--persist')],
      'env': {},
  }

  # Also save important environment variables.
  if program == 'hostapd' and 'WIFI_PSK' in os.environ:
    to_save['env']['WIFI_PSK'] = utils.validate_and_sanitize_psk(
        os.environ['WIFI_PSK'])
  if program == 'wpa_supplicant' and 'WIFI_CLIENT_PSK' in os.environ:
    to_save['env']['WIFI_CLIENT_PSK'] = utils.validate_and_sanitize_psk(
        os.environ['WIFI_CLIENT_PSK'])

  utils.atomic_write(
      utils.get_filename(program, utils.FILENAME_KIND.options, band, tmp=tmp),
      repr(to_save))


def load_options(program, band, tmp):
  """Loads program options, if any have been saved.

  Args:
    program: The program for which to load options.
    band: The band for which to load options.
    tmp: Whether to load options from /tmp (i.e. what is currently running) or
      _CONFIG_DIR (the options from last time --persist was set).

  Returns:
    The stored options (which can be passed to wifi._run), or None if the file
    cannot be opened.
  """
  filename = utils.get_filename(program, utils.FILENAME_KIND.options, band,
                                tmp=tmp)
  try:
    with open(filename) as options_file:
      saved = ast.literal_eval(options_file.read())
      os.environ.update(saved['env'])
      return saved['argv']
  except IOError as e:
    if e.args[0] == errno.ENOENT:
      return None
    raise


def delete_options(program, band):
  """Deletes persisted program options from _CONFIG_DIR.

  Args:
    program: The program for which to delete options.
    band: The band for which to delete options.

  Returns:
    Whether deletion succeeded.
  """
  filename = utils.get_filename(program, utils.FILENAME_KIND.options, band)
  if os.path.exists(filename):
    try:
      os.remove(filename)
      utils.log('Removed persisted options for %s GHz %s.', band, program)
    except OSError:
      utils.log('Failed to remove persisted options for %s GHz %s.',
                band, program)
      return False
  else:
    utils.log('No persisted options to remove for %s GHz %s.', band, program)

  return True
