/*
 *  Copyright (C) 2015-2019 Savoir-faire Linux Inc.
 *  Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
 *  Author: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
 *
 *  This program 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.
 *
 *  This program 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 this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
 */
#define OUTGOING_TLS_SERVER_TAG 0
#define NEGOTIATION_TIMOUT_TAG 1
#define REGISTRATION_TAG 2
#define LOCALPORT_TAG 3
#define CUSTOM_PORT_TAG 4
#define CUSTOM_ADDRESS_TAG 5
#define MINAUDIO_TAG 6
#define MAXAUDIO_TAG 7
#define MINVIDEO_TAG 8
#define MAXVIDEO_TAG 9

#import "AccAdvancedSipVC.h"

//LRC
#import <api/lrc.h>
#import <api/newaccountmodel.h>

@interface AccAdvancedSipVC () {
    __unsafe_unretained IBOutlet NSButton *encryptMediaButton;
    __unsafe_unretained IBOutlet NSButton *enableSDESButton;
    __unsafe_unretained IBOutlet NSButton *fallbackEncryptionFailureButton;
    __unsafe_unretained IBOutlet NSButton *encryptNegotiationButton;
    __unsafe_unretained IBOutlet NSButton *checkIncomingCertificatesButton;
    __unsafe_unretained IBOutlet NSButton *checkAnswerCertificatesButton;
    __unsafe_unretained IBOutlet NSButton *requereIncomingCertificateButton;
    __unsafe_unretained IBOutlet NSPopUpButton *tlsProtocolsList;
    __unsafe_unretained IBOutlet NSTextField *outgoingTlsServerNameField;
    __unsafe_unretained IBOutlet NSStepper *negotiationTimeoutStepper;
    __unsafe_unretained IBOutlet NSTextField *negotiationTimeoutField;
    __unsafe_unretained IBOutlet NSStepper *registrationTimeoutStepper;
    __unsafe_unretained IBOutlet NSTextField *registrationTimeoutField;
    __unsafe_unretained IBOutlet NSStepper *networkStepper;
    __unsafe_unretained IBOutlet NSTextField *networkField;
    __unsafe_unretained IBOutlet NSTextField *customAddressField;
    __unsafe_unretained IBOutlet NSButton *useCustomAddressButton;
    __unsafe_unretained IBOutlet NSStepper *customPortStepper;
    __unsafe_unretained IBOutlet NSTextField *customPortField;
    __unsafe_unretained IBOutlet NSStepper *minAudioPortStepper;
    __unsafe_unretained IBOutlet NSStepper *maxAudioPortStepper;
    __unsafe_unretained IBOutlet NSStepper *minVideoPortStepper;
    __unsafe_unretained IBOutlet NSStepper *maxVideoPortStepper;
    __unsafe_unretained IBOutlet NSTextField *minAudioRTPRange;
    __unsafe_unretained IBOutlet NSTextField *maxAudioRTPRange;
    __unsafe_unretained IBOutlet NSTextField *minVideoRTPRange;
    __unsafe_unretained IBOutlet NSTextField *maxVideoRTPRange;
}

@end

@implementation AccAdvancedSipVC

NSString *TLS_PROTOCOL_DEFAULT = @"Default";
NSString *TLS_PROTOCOL_TLSv1 = @"TLSv1";
NSString *TLS_PROTOCOL_TLSv1_1 = @"TLSv1_1";
NSString *TLS_PROTOCOL_TLSv1_2 = @"TLSv1_2";

@synthesize privateKeyPaswordField;
@synthesize selectCACertificateButton, selectUserCertificateButton, selectPrivateKeyButton;

- (void)awakeFromNib
{
    [super awakeFromNib];
    [negotiationTimeoutStepper setTag:NEGOTIATION_TIMOUT_TAG];
    [negotiationTimeoutField setTag:NEGOTIATION_TIMOUT_TAG];
    [registrationTimeoutStepper setTag:REGISTRATION_TAG];
    [registrationTimeoutField setTag:REGISTRATION_TAG];
    [networkStepper setTag:LOCALPORT_TAG];
    [networkField setTag:LOCALPORT_TAG];
    [customAddressField setTag: CUSTOM_ADDRESS_TAG];
    [outgoingTlsServerNameField setTag: OUTGOING_TLS_SERVER_TAG];
    [customPortStepper setTag: CUSTOM_PORT_TAG];
    [customPortField setTag: CUSTOM_PORT_TAG];
    [minAudioPortStepper setTag:MINAUDIO_TAG];
    [maxAudioPortStepper setTag:MAXAUDIO_TAG];
    [minVideoPortStepper setTag:MINVIDEO_TAG];
    [maxVideoPortStepper setTag:MAXVIDEO_TAG];
    [minAudioRTPRange setTag:MINAUDIO_TAG];
    [maxAudioRTPRange setTag:MAXAUDIO_TAG];
    [minVideoRTPRange setTag:MINVIDEO_TAG];
    [maxVideoRTPRange setTag:MAXVIDEO_TAG];
    [[self view] setAutoresizingMask: NSViewMinXMargin | NSViewMaxXMargin | NSViewHeightSizable];

}

-(void)viewDidLoad {
    [super viewDidLoad];
    NSMenu *tlsMethods = [[NSMenu alloc] initWithTitle:@""];
    [tlsMethods addItem: [[NSMenuItem alloc] initWithTitle: TLS_PROTOCOL_DEFAULT action:nil keyEquivalent:@""]];
    [tlsMethods addItem: [[NSMenuItem alloc] initWithTitle: TLS_PROTOCOL_TLSv1 action:nil keyEquivalent:@""]];
    [tlsMethods addItem: [[NSMenuItem alloc] initWithTitle: TLS_PROTOCOL_TLSv1_1 action:nil keyEquivalent:@""]];
    [tlsMethods addItem: [[NSMenuItem alloc] initWithTitle: TLS_PROTOCOL_TLSv1_2 action:nil keyEquivalent:@""]];
    tlsProtocolsList.menu = tlsMethods;
    [self updateView];
}

- (void) setSelectedAccount:(const QString&) account {
    [super setSelectedAccount: account];
    [self updateView];
}

- (void) updateView {
    auto accountProperties = self.accountModel->getAccountConfig(self.selectedAccountID);
    [encryptMediaButton setState: accountProperties.SRTP.enable];
    [enableSDESButton setState: accountProperties.SRTP.keyExchange == lrc::api::account::KeyExchangeProtocol::SDES ? NSControlStateValueOn : NSControlStateValueOff];
    [fallbackEncryptionFailureButton setState: accountProperties.SRTP.rtpFallback];
    [encryptNegotiationButton setState: accountProperties.TLS.enable];
    [selectCACertificateButton setEnabled: accountProperties.TLS.enable];
    [selectUserCertificateButton setEnabled: accountProperties.TLS.enable];
    [selectPrivateKeyButton setEnabled: accountProperties.TLS.enable];
    [privateKeyPaswordField setEnabled: accountProperties.TLS.enable];
    [checkIncomingCertificatesButton setState: accountProperties.TLS.verifyServer];
    [checkAnswerCertificatesButton setState: accountProperties.TLS.verifyClient];
    [requereIncomingCertificateButton setState: accountProperties.TLS.requireClientCertificate];
    switch (accountProperties.TLS.method) {
        case lrc::api::account::TlsMethod::DEFAULT:
            [tlsProtocolsList selectItemWithTitle:TLS_PROTOCOL_DEFAULT];
            break;
        case lrc::api::account::TlsMethod::TLSv1:
            [tlsProtocolsList selectItemWithTitle:TLS_PROTOCOL_TLSv1];
            break;
        case lrc::api::account::TlsMethod::TLSv1_1:
            [tlsProtocolsList selectItemWithTitle:TLS_PROTOCOL_TLSv1_1];
            break;
        case lrc::api::account::TlsMethod::TLSv1_2:
            [tlsProtocolsList selectItemWithTitle:TLS_PROTOCOL_TLSv1_2];
            break;

        default:
            break;
    }
    [negotiationTimeoutStepper setIntegerValue: accountProperties.TLS.negotiationTimeoutSec];
    [negotiationTimeoutField setIntegerValue: accountProperties.TLS.negotiationTimeoutSec];
    [registrationTimeoutStepper setIntegerValue: accountProperties.Registration.expire];
    [registrationTimeoutField setIntegerValue: accountProperties.Registration.expire];
    [networkStepper setIntegerValue: accountProperties.localPort];
    [networkField setIntegerValue: accountProperties.localPort];
    [customAddressField setEnabled:!accountProperties.publishedSameAsLocal];
    [customPortField setEnabled:!accountProperties.publishedSameAsLocal];
    [customPortStepper setEnabled:!accountProperties.publishedSameAsLocal];
    [useCustomAddressButton setState:!accountProperties.publishedSameAsLocal];
    [customPortStepper setIntegerValue: accountProperties.publishedPort];
    [customPortField setIntegerValue: accountProperties.publishedPort];
    [customAddressField setStringValue: accountProperties.publishedAddress.toNSString()];
    [minAudioPortStepper setIntegerValue: accountProperties.Audio.audioPortMin];
    [minAudioRTPRange setIntegerValue: accountProperties.Audio.audioPortMin];
    [maxAudioPortStepper setIntegerValue: accountProperties.Audio.audioPortMax];
    [maxAudioRTPRange setIntegerValue: accountProperties.Audio.audioPortMax];
    [minVideoPortStepper setIntegerValue: accountProperties.Video.videoPortMin];
    [minVideoRTPRange setIntegerValue: accountProperties.Video.videoPortMin];
    [maxVideoPortStepper setIntegerValue: accountProperties.Video.videoPortMax];
    [maxVideoRTPRange setIntegerValue: accountProperties.Video.videoPortMax];
}

#pragma mark - Actions

- (IBAction)toggleEnableSDES:(id)sender {
    auto accountProperties = self.accountModel->getAccountConfig(self.selectedAccountID);
    lrc::api::account::KeyExchangeProtocol newState = [sender state] == NSControlStateValueOn ? lrc::api::account::KeyExchangeProtocol::SDES : lrc::api::account::KeyExchangeProtocol::NONE;
    if(accountProperties.SRTP.keyExchange != newState) {
        accountProperties.SRTP.keyExchange = newState;
        self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
    }
}
- (IBAction)toggleEncryptMedia:(id)sender {
    auto accountProperties = self.accountModel->getAccountConfig(self.selectedAccountID);
    if(accountProperties.SRTP.enable!= [sender state]) {
        accountProperties.SRTP.enable = [sender state];
        self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
    }
}
- (IBAction)toggleFallbackEncryptionFailure:(id)sender {
    auto accountProperties = self.accountModel->getAccountConfig(self.selectedAccountID);
    if(accountProperties.SRTP.rtpFallback != [sender state]) {
        accountProperties.SRTP.rtpFallback = [sender state];
        self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
    }
}
- (IBAction)toggleEncryptNegotiation:(id)sender {
    auto accountProperties = self.accountModel->getAccountConfig(self.selectedAccountID);
    if(accountProperties.TLS.enable != [sender state]) {
        accountProperties.TLS.enable = [sender state];
        self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
        [selectCACertificateButton setEnabled: [sender state]];
        [selectUserCertificateButton setEnabled: [sender state]];
        [selectPrivateKeyButton setEnabled: [sender state]];
        [privateKeyPaswordField setEnabled: [sender state]];
    }
}
- (IBAction)toggleVerifyServerCertificate:(id)sender {
    auto accountProperties = self.accountModel->getAccountConfig(self.selectedAccountID);
    if(accountProperties.TLS.verifyServer != [sender state]) {
        accountProperties.TLS.verifyServer = [sender state];
        self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
    }
}
- (IBAction)toggleVerifyClientCertificate:(id)sender {
    lrc::api::account::ConfProperties_t accountProperties = self.accountModel->getAccountConfig(self.selectedAccountID);
    if(accountProperties.TLS.verifyClient != [sender state]) {
        accountProperties.TLS.verifyClient = [sender state];
        self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
    }
}
- (IBAction)toggleCertForIncomingConnection:(id)sender {
    lrc::api::account::ConfProperties_t accountProperties = self.accountModel->getAccountConfig(self.selectedAccountID);
    if(accountProperties.TLS.requireClientCertificate != [sender state]) {
        accountProperties.TLS.requireClientCertificate = [sender state];
        self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
    }
}

- (IBAction)enableCustomAddress:(id)sender {
    lrc::api::account::ConfProperties_t accountProperties = self.accountModel->getAccountConfig(self.selectedAccountID);
    if(accountProperties.publishedSameAsLocal != ![sender state]) {
        accountProperties.publishedSameAsLocal = ![sender state];
        self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
        [customAddressField setEnabled:[sender state]];
        [customPortField setEnabled:[sender state]];
        [customPortStepper setEnabled:[sender state]];
    }
}

- (IBAction)chooseTlsProtocol:(id)sender {
    int index = [sender indexOfSelectedItem];
    if(index < 0) {
        return;
    }
    NSString *title = [[tlsProtocolsList.menu itemAtIndex:index] title];
    lrc::api::account::TlsMethod method;

    if(title == TLS_PROTOCOL_DEFAULT) {
        method = lrc::api::account::TlsMethod::DEFAULT;
    } else if(title == TLS_PROTOCOL_TLSv1) {
        method = lrc::api::account::TlsMethod::TLSv1;
    } else if(title == TLS_PROTOCOL_TLSv1_1) {
        method = lrc::api::account::TlsMethod::TLSv1_1;
    } else if(title == TLS_PROTOCOL_TLSv1_2) {
        method = lrc::api::account::TlsMethod::TLSv1_2;
    } else {
        return;
    }
    auto accountProperties = self.accountModel->getAccountConfig(self.selectedAccountID);
    if(accountProperties.TLS.method != method) {
        accountProperties.TLS.method = method;
        self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
    }
}

- (IBAction) valueDidChange: (id) sender
{
    lrc::api::account::ConfProperties_t accountProperties = self.accountModel->getAccountConfig(self.selectedAccountID);

    switch ([sender tag]) {
        case OUTGOING_TLS_SERVER_TAG:
            if(accountProperties.TLS.serverName != QString::fromNSString([sender stringValue])) {
                accountProperties.TLS.serverName = QString::fromNSString([sender stringValue]);
                self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
            }
            return;
        case NEGOTIATION_TIMOUT_TAG:
            if(accountProperties.TLS.negotiationTimeoutSec != [[sender stringValue] integerValue]) {
                accountProperties.TLS.negotiationTimeoutSec = [[sender stringValue] integerValue];
                self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
                [negotiationTimeoutStepper setIntegerValue: [[sender stringValue] integerValue]];
                [negotiationTimeoutField setIntegerValue: [[sender stringValue] integerValue]];
            }
            return;
        case REGISTRATION_TAG:
            if(accountProperties.Registration.expire != [[sender stringValue] integerValue]) {
                accountProperties.Registration.expire = [[sender stringValue] integerValue];
                self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
                [registrationTimeoutStepper setIntegerValue: [[sender stringValue] integerValue]];
                [registrationTimeoutField setIntegerValue: [[sender stringValue] integerValue]];
            }
            return;
        case LOCALPORT_TAG:
            if(accountProperties.localPort != [[sender stringValue] integerValue]) {
                accountProperties.localPort = [[sender stringValue] integerValue];
                self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
                [networkStepper setIntegerValue: [[sender stringValue] integerValue]];
                [networkField setIntegerValue: [[sender stringValue] integerValue]];
            }
            return;
        case CUSTOM_ADDRESS_TAG:
            if(accountProperties.publishedAddress != QString::fromNSString([sender stringValue])) {
                NSString *name = [sender stringValue];
                accountProperties.publishedAddress = QString::fromNSString([sender stringValue]);
                self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
            }
            return;
        case CUSTOM_PORT_TAG:
            if(accountProperties.publishedPort != [[sender stringValue] integerValue]) {
                accountProperties.publishedPort = [[sender stringValue] integerValue];
                self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
                [customPortStepper setIntegerValue: [[sender stringValue] integerValue]];
                [customPortField setIntegerValue: [[sender stringValue] integerValue]];
            }
            return;
        case MINAUDIO_TAG:
            if(accountProperties.Audio.audioPortMin != [[sender stringValue] integerValue]) {
                accountProperties.Audio.audioPortMin = [[sender stringValue] integerValue];
                self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
                [minAudioPortStepper setIntegerValue: [[sender stringValue] integerValue]];
                [minAudioRTPRange setIntegerValue: [[sender stringValue] integerValue]];
            }
            return;
        case MAXAUDIO_TAG:
            if(accountProperties.Audio.audioPortMax != [[sender stringValue] integerValue]) {
                accountProperties.Audio.audioPortMax = [[sender stringValue] integerValue];
                self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
                [maxAudioPortStepper setIntegerValue: [[sender stringValue] integerValue]];
                [maxAudioRTPRange setIntegerValue: [[sender stringValue] integerValue]];
            }
            return;
        case MINVIDEO_TAG:
            if(accountProperties.Video.videoPortMin != [[sender stringValue] integerValue]) {
                accountProperties.Video.videoPortMin = [[sender stringValue] integerValue];
                self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
                [minVideoPortStepper setIntegerValue: [[sender stringValue] integerValue]];
                [minVideoRTPRange setIntegerValue: [[sender stringValue] integerValue]];
            }
            return;
        case MAXVIDEO_TAG:
            if(accountProperties.Video.videoPortMax != [[sender stringValue] integerValue]) {
                accountProperties.Video.videoPortMax = [[sender stringValue] integerValue];
                self.accountModel->setAccountConfig(self.selectedAccountID, accountProperties);
                [maxVideoPortStepper setIntegerValue: [[sender stringValue] integerValue]];
                [maxVideoRTPRange setIntegerValue: [[sender stringValue] integerValue]];
            }
            return;
        default:
            break;
    }
    [super valueDidChange:sender];
}

#pragma mark - NSTextFieldDelegate methods

-(void)controlTextDidEndEditing:(NSNotification *)notif
{
    NSTextField *textField = [notif object];
    [self valueDidChange:textField];
}

@end
