/* -*- Mode: objc; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
/**
 * Copyright (c) 2013-2014, Regents of the University of California,
 *
 * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
 * authors and contributors.
 *
 * NFD Control Center is free software: you can redistribute it and/or modify it under the
 * terms of the GNU General Public License as published by the Free Software Foundation,
 * either version 3 of the License, or (at your option) any later version.
 *
 * NFD Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with NFD
 * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
 *
 * \author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
 * \author Ilya Moiseenko <http://ilyamoiseenko.com/>
 */

#include "config.hpp"
#import "menu-delegate.h"
#import "ndnd-status-operation.h"
#import "tight-menu-item-view.h"

@implementation MenuDelegate

@synthesize interestSent;
@synthesize interestRecv;
@synthesize dataSent;
@synthesize dataRecv;

-(id)init
{
  if (![super init]) {
    return nil;
  }

  interestSent = @"N/A";
  interestRecv = @"N/A";
  dataSent = @"N/A";
  dataRecv = @"N/A";

  m_autoconfInProgress = false;
  // m_operationQueue = [[NSOperationQueue alloc] init];
  return self;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
  // Register the preference defaults early.
  NSDictionary *appDefaults =
    [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithBool:YES], @"allowSoftwareUpdates",
                      [NSNumber numberWithBool:YES], @"enableHubDiscovery",
                      [NSNumber numberWithBool:NO],  @"shutdownNdndOnExit",
                  nil
     ];
  [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];

   // Other initialization...

  m_daemonStarted = false;

  NSBundle *bundle = [NSBundle bundleForClass:[self class]];
  m_connectedIcon = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"FlatConnected" ofType:@"png"]];
  m_disconnectedIcon = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"FlatDisconnected" ofType:@"png"]];

  [statusItem setImage:m_disconnectedIcon];

  // m_statusXslt = [NSData dataWithContentsOfFile:[bundle pathForResource:@"status" ofType:@"xslt"]];
  // m_statusToFibXslt = [NSData dataWithContentsOfFile:[bundle pathForResource:@"status-to-fib" ofType:@"xslt"]];

  // [NSTimer scheduledTimerWithTimeInterval: 1.0
  //          target: self
  //          selector:@selector(onTick:)
  //          userInfo: nil
  //          repeats:YES];
  // [self updateStatus];

  // m_systemEvents = [[SystemEvents alloc] init];
}

- (void)applicationWillTerminate:(NSNotification *)aNotification
{
  // [m_systemEvents disable];
}

-(void)awakeFromNib
{
  statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
  [statusItem setMenu:statusMenu];
  [statusItem setToolTip:@"NDN Control Center"];
  [statusItem setEnabled:YES];
  [statusItem setHighlightMode:YES];
  //[statusItem setTarget:self];

  [statusItem setTitle:@""];

  float menuItemHeight = 20;

  NSRect viewRect = NSMakeRect(0, 0, /* width autoresizes */ 1, menuItemHeight);
  connectionStatusView = [[TightMenuItemView alloc] initWithFrame:viewRect];
  connectionStatusView.autoresizingMask = NSViewWidthSizable;

  [connectionStatus setView:connectionStatusView];
  [connectionStatus setTarget:self];

  [daemonStatus setView: daemonStatusView];
  [daemonStatus setTarget:self];
}

-(IBAction)openDaemonStatus:(id)sender
{
}

-(IBAction)showExitConfirmationWindow:(id)sender
{
  if ([[NSUserDefaults standardUserDefaults] boolForKey:@"shutdownNdndOnExit"]) {
    [m_operationQueue cancelAllOperations];

    // [m_operationQueue addOperationWithBlock:^{
    //     NSTask *task = [[NSTask alloc] init];
    //     [task setLaunchPath: @NDND_STOP_COMMAND];
    //     [task launch];
    //     [task waitUntilExit];
    //   }];

    [m_operationQueue waitUntilAllOperationsAreFinished];
    [NSApp terminate:self];
  }
  else {
    NSAlert *alert = [[NSAlert alloc] init];
    [alert addButtonWithTitle:@"Yes"];
    [alert addButtonWithTitle:@"No"];
    [alert addButtonWithTitle:@"Cancel"];
    [alert setMessageText:@"Shutdown NDN daemon as well?"];
    [alert setInformativeText:@"All NDN operations will be become unavailable."];
    [alert setAlertStyle:NSCriticalAlertStyle];
    // [alert setShowsSuppressionButton: YES];

    NSInteger res = [alert runModal];
    if (res == NSAlertFirstButtonReturn) {
      // "YES" stop ndnd
      [m_operationQueue cancelAllOperations];

      // [m_operationQueue addOperationWithBlock:^{
      //     NSTask *task = [[NSTask alloc] init];
      //     [task setLaunchPath: @NDND_STOP_COMMAND];
      //     [task launch];
      //     [task waitUntilExit];
      //   }];

      [m_operationQueue waitUntilAllOperationsAreFinished];
      [NSApp terminate:self];
    } else if (res == NSAlertSecondButtonReturn) {
      // "NO" terminate app but keep ndnd running
      [m_operationQueue cancelAllOperations];
      [NSApp terminate:self];
    }
  }
}

-(void)onTick:(NSTimer *)timer
{
  [self updateStatus];
}

-(void)updateStatus
{
  NSOperation *operation = [[NdndStatusOperation alloc] initWithDelegate:self];
  [m_operationQueue addOperation:operation];
}

-(void)updateStatusWithDependency:(NSOperation*)dependency
{
  NSOperation *operation = [[NdndStatusOperation alloc] initWithDelegate:self];
  [operation addDependency:dependency];

  [m_operationQueue addOperation:dependency];
  [m_operationQueue addOperation:operation];
}

- (void)statusUpdated:(NSXMLDocument*)document
{
  // if (!m_daemonStarted) {
  //   m_daemonStarted = true;
  //   [connectionStatusView setStatus:@"Active"];

  //   [statusItem setImage:m_connectedIcon];
  // }

  // NSXMLDocument *statusXml = [document objectByApplyingXSLT:m_statusXslt
  //                             arguments:nil
  //                             error:nil];

  // NSXMLDocument *statusFibXml = [document objectByApplyingXSLT:m_statusToFibXslt
  //                                arguments:nil
  //                                error:nil];

  // NSXMLNode *element = [[statusXml rootElement] childAtIndex:0]; //data
  // [self setDataRecv:[[element childAtIndex:0] stringValue]];
  // [self setDataSent:[[element childAtIndex:1] stringValue]];

  // element = [[statusXml rootElement] childAtIndex:1]; //interests
  // [self setInterestRecv:[[element childAtIndex:0] stringValue]];
  // [self setInterestSent:[[element childAtIndex:1] stringValue]];

  // [preferencesDelegate updateFibStatus:statusFibXml];

  // if ([[NSUserDefaults standardUserDefaults] boolForKey:@"enableHubDiscovery"]) {
  //   NSArray *autoconf = [[statusFibXml rootElement] nodesForXPath:@"//fib/prefix[text()='ndn:/autoconf-route']" error:nil];
  //   if ([autoconf count] == 0)
  //     {
  //       [self restartDaemon:nil];
  //     }
  // }
}

- (void)statusUnavailable:(id)none
{
  // // try start ndnd if it is not started yet
  // if (m_daemonStarted) {
  //   m_daemonStarted = false;

  //   [connectionStatusView setStatus:@"Starting..."];

  //   [statusItem setImage:m_disconnectedIcon];
  // }

  // [self setInterestSent:@"N/A"];
  // [self setInterestRecv:@"N/A"];
  // [self setDataSent:@"N/A"];
  // [self setDataRecv:@"N/A"];

  // [preferencesDelegate updateFibStatus:nil];

  // m_autoconfInProgress = true;

  // // NSOperation *startOp = [NSBlockOperation blockOperationWithBlock:^{
  // //     NSTask *task = [[NSTask alloc] init];
  // //     [task setLaunchPath: @NDND_START_COMMAND];
  // //     [task launch];
  // //   }];

  // // if ([[NSUserDefaults standardUserDefaults] boolForKey:@"enableHubDiscovery"]) {
  // //   NSOperation *autoconfOp = [NSBlockOperation blockOperationWithBlock:^{
  // //       NSTask *task = [[NSTask alloc] init];
  // //       [task setLaunchPath: @NDND_AUTOCONFIG_COMMAND];
  // //       [task launch];
  // //       [task waitUntilExit];

  // //       m_autoconfInProgress = false;
  // //     }];

  // //   [autoconfOp addDependency:startOp];
  // //   [m_operationQueue addOperation:autoconfOp];
  // // }

  // // [m_operationQueue addOperation:startOp];
}

-(void)restartDaemon:(id)none
{
  // if (![[NSUserDefaults standardUserDefaults] boolForKey:@"enableHubDiscovery"])
  //   return;

  // if (m_autoconfInProgress)
  //   return;

  // NSLog(@"No automatically detected route configured, trying to get one");

  // // m_autoconfInProgress = true;
  // // [m_operationQueue addOperationWithBlock:^{
  // //     NSTask *task = [[NSTask alloc] init];
  // //     [task setLaunchPath: @NDND_AUTOCONFIG_COMMAND];
  // //     [task launch];
  // //     [task waitUntilExit];

  // //     m_autoconfInProgress = false;
  // //   }];
}

@end
