/*
 *  Copyright (C) 2015-2016 Savoir-faire Linux Inc.
 *  Author: Alexandre Lision <alexandre.lision@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.
 */
#import <Cocoa/Cocoa.h>

namespace lrc {
    namespace api {
        namespace account {
            struct Info;
        }
    }
}

@interface RingWindowController : NSWindowController <NSSharingServicePickerDelegate> {
    IBOutlet NSView *currentView;
}

/**
 * KVO to show or hide some UI elements in RingWindow:
 * - Share button
 * - QRCode
 * - Explanatory label
 */
@property (nonatomic) BOOL notRingAccount;
/**
 * KVO to show or hide ringIDLabel
 */
@property (nonatomic) BOOL isSIPAccount;


- (IBAction)openPreferences:(id)sender;

/**
 * This method is intended to be used by the ChooseAccountVC to signal the fact that
 * the selected account has been changed by user. It will then forward this information
 * to relevant controllers and views.
 * @param accInfo reference to selected account
 */
- (void) selectAccount:(const lrc::api::account::Info&)accInfo;

/**
 * Method triggered when a panel on the right is closed by user action. It triggers any action needed
 * on itself or other view controllers to react properly to this event.
 */
-(void) rightPanelClosed;

/**
 * Triggered by Conversation view when the current conversation is switching from pending state to
 * trusted. It triggers conversation list change in SmartViewVC in order to keep current conversation
 * visible in left list (to "follow it").
 */
-(void) currentConversationTrusted;

/**
 * Triggered by SmartView when list type is changed by user. It closes the right view as the selected conversation
 * is not in filtered list anymore.
 * @note This method is not to be used if list change is triggered by a left panel view.
 */
-(void) listTypeChanged;

/**
 * Triggered by Choosen account VC when all accounts deleted
 */
-(void)allAccountsDeleted;

@end
