// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_SWITCHER_PANEL_CONTROLLER_H_
#define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_SWITCHER_PANEL_CONTROLLER_H_

#import <UIKit/UIKit.h>

#include "base/ios/block_types.h"
#import "ios/chrome/browser/ui/tab_switcher/tab_switcher_model.h"
#import "ios/chrome/browser/ui/tab_switcher/tab_switcher_panel_cell.h"

namespace ios {
class ChromeBrowserState;
}

@class TabSwitcherLocalSessionCell;
@class TabSwitcherPanelController;

@protocol TabSwitcherPanelControllerDelegate<NSObject>

// Called when the user selects the cell representing the distant tab |tab|.
- (void)tabSwitcherPanelController:
            (TabSwitcherPanelController*)tabSwitcherPanelController
               didSelectDistantTab:(synced_sessions::DistantTab*)tab;

// Called when the user selects the cell representing the local tab |tab|.
- (void)tabSwitcherPanelController:
            (TabSwitcherPanelController*)tabSwitcherPanelController
                 didSelectLocalTab:(Tab*)tab;

// Called when the user pressed the close button on the cell representing the
// local tab |tab|.
- (void)tabSwitcherPanelController:
            (TabSwitcherPanelController*)tabSwitcherPanelController
                  didCloseLocalTab:(Tab*)tab;

// Called when the overlay view visibility changed.
- (void)tabSwitcherPanelControllerDidUpdateOverlayViewVisibility:
    (TabSwitcherPanelController*)tabSwitcherPanelController;

@end

@class TabSwitcherPanelView;
// The tab switcher panel controller manages a panel view.
// It can manage either distant or local sessions and uses a TabSwitcherModel
// as its data source.
@class TabSwitcherCache;

@interface TabSwitcherPanelController : NSObject

@property(unsafe_unretained, nonatomic, readonly) TabSwitcherPanelView* view;
@property(nonatomic, unsafe_unretained) id<TabSwitcherPanelControllerDelegate>
    delegate;
@property(nonatomic, readonly) TabSwitcherSessionType sessionType;

// Initializes a controller for a view showing local tabs. |offTheRecord|
// determines whether the tabs will be shown for the incognito browser state or
// not. |model| is used to populate the view and must not be nil.
- (instancetype)initWithModel:(TabSwitcherModel*)model
        forLocalSessionOfType:(TabSwitcherSessionType)type
                    withCache:(TabSwitcherCache*)cache
                 browserState:(ios::ChromeBrowserState*)browserState;

// Initializes a controller for a view showing the tabs of a distant session.
// |model| is used to populate the view and must not be nil.
- (instancetype)initWithModel:(TabSwitcherModel*)model
     forDistantSessionWithTag:(std::string const&)sessionTag
                 browserState:(ios::ChromeBrowserState*)browserState;

// Tells the controller that the collectionview's content may need to be
// updated.
- (void)updateCollectionViewIfNeeded;

// Returns the tag of the distant session.
- (std::string)sessionTag;

// Returns true if the new tab button should be shown.
- (BOOL)shouldShowNewTabButton;

// Scrolls the collection view so that the tab cell at the given index is
// visible.
- (void)scrollTabIndexToVisible:(NSInteger)index triggerLayout:(BOOL)layout;

// Returns the cell for the tab at the given index.
// This methods should only be used for animation purpose.
- (TabSwitcherLocalSessionCell*)localSessionCellForTabAtIndex:(NSInteger)index;

- (CGRect)localSessionCellFrameForTabAtIndex:(NSInteger)index;

// Reloads cells.
- (void)reload;

- (UICollectionView*)collectionView;

// Returns the distantSession owned and displayed by this controller.
- (const synced_sessions::DistantSession*)distantSession;

@end

#endif  // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_SWITCHER_PANEL_CONTROLLER_H_
