#!/usr/bin/perl

use strict;
use warnings;

use EBox::Global;
use EBox;
use Error qw(:try);

EBox::init();
my $global = EBox::Global->getInstance(1);

sub usage {
	print "Usage: $0 start|stop|restart\n";
	print "       $0 <module> start|stop|restart\n";
	exit 1;
}

sub start() {
	my @names = grep (! /^apache$/ ,@{$global->modNames});
	push(@names, 'apache');

	foreach my $modname (@names) {
	  moduleAction($modname, 'restartService', 'start');
	}
}

sub stop() {
	my @names = grep (! /^apache$/ ,@{$global->modNames});
	push(@names, 'apache');

	foreach my $modname (@names) {
	  moduleAction($modname, 'stopService', 'stop');
	}
}


sub moduleAction
{
  my ($modname, $action, $actionName) = @_;
  my $mod = EBox::Global->modInstance($modname);
  if (!defined $mod) {
    print STDERR "$modname is not a valid module name\n";
    exit 2;
  }

  my $success;
  my $errorMsg;
  try {
    $mod->$action();
    $success = 1;
  } 
  catch EBox::Exceptions::Base with {
      my $ex = shift;
      $success = 0;
      $errorMsg =  $ex->text;
  };

  printModuleMessage($modname, $actionName, $success, $errorMsg);
}


sub printModuleMessage
{
  my ($modname, $action, $success, $errorMsg) = @_;

  my $successMsg = $success ?  '   [ OK ]' : '[ ERROR ]';
  my $tabstr     = tabs($modname);

  print STDOUT 'EBox: ', $action, ' ', $modname, ':',  $tabstr, $successMsg, "\n";

  if ($errorMsg) {
    print STDERR $errorMsg, "\n";
  }
}

sub tabs
{
  my ($modname) = @_;

  my $tabs;
  { use integer; $tabs = 3 - (length($modname)/8); };

  my $tabstr = "\t" x $tabs;
  return $tabstr;
}


sub moduleRestart {
  my ($modname) = @_;

  moduleAction($modname, 'restartService', 'restart');
}

sub moduleStop {
  my ($modname) = @_;
 
  moduleAction($modname, 'stopService', 'stop');
}

sub main
{
  if (@ARGV == 1) {
    if ($ARGV[0] eq 'start') {
      start();
    } 
    elsif ($ARGV[0] eq 'restart') {
      stop();
      start();
    }
    elsif ($ARGV[0] eq 'force-reload') {
      stop();
      start();
    } 
    elsif ($ARGV[0] eq 'stop') {
      stop();
    } 
    else {
      usage();
    }
  } 
  elsif (@ARGV == 2) {
    # action upon one module mode
    my ($modName, $action) = @ARGV;

    if (($action eq 'restart') or ($action eq 'start')) {
      moduleRestart($modName);
    } 
    elsif ($action eq 'stop') {
      moduleStop($modName);
    }
    else {
      usage();
    }
  } 
  else {
    usage();
  }
}

main();
1;
