import wx
import wx.lib.agw.customtreectrl as CT
#from pydrive.drive import GoogleDrive
#from pydrive.auth import GoogleAuth
try :
    from .GoSyncEvents import *
except (ImportError, ValueError):
    from GoSyncEvents import *

class GoSyncDriveTree(CT.CustomTreeCtrl):
    def __init__(self, parent, *args, **kw):
        CT.CustomTreeCtrl.__init__(self, parent, *args, **kw)

    def GetCheckedItems(self, itemParent=None, checkedItems=None):
        if itemParent is None:
            itemParent = self.GetRootItem()

        if checkedItems is None:
            checkedItems = []

        child, cookie = self.GetFirstChild(itemParent)

        while child:

            if self.IsItemChecked(child):
                checkedItems.append(child)

            checkedItems = self.GetCheckedItems(child, checkedItems)
            child, cookie = self.GetNextChild(itemParent, cookie)

        return checkedItems

class SelectionPage(wx.Panel):
    def __init__(self, parent, sync_model):
        wx.Panel.__init__(self, parent, style=wx.RAISED_BORDER)

        headerFont = wx.Font(11.5, wx.SWISS, wx.NORMAL, wx.NORMAL)

        self.sync_model = sync_model
        self.dstc = GoSyncDriveTree(self, pos=(0,0))

        self.t1 = wx.StaticText(self, -1, "Choose the directories to sync:", pos=(0,0))
        self.t1.SetFont(headerFont)

        self.cb = wx.CheckBox(self, -1, 'Sync Everything', (10, 10))
        self.cb.SetValue(True)
        self.cb.Disable()
        self.dstc.Disable()
        self.cb.Bind(wx.EVT_CHECKBOX, self.SyncSetting)

        self.Bind(CT.EVT_TREE_ITEM_CHECKED, self.ItemChecked)

        GoSyncEventController().BindEvent(self, GOSYNC_EVENT_CALCULATE_USAGE_DONE,
                                          self.RefreshTree)
        GoSyncEventController().BindEvent(self, GOSYNC_EVENT_CALCULATE_USAGE_STARTED,
                                          self.OnUsageCalculationStarted)

        self.cb.Bind(wx.EVT_CHECKBOX, self.SyncSetting)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.t1, 0, wx.ALL)
        sizer.Add(self.cb, 0, wx.ALL)
        sizer.Add(self.dstc, 1, wx.EXPAND,2)
        self.SetSizer(sizer)

    def OnUsageCalculationStarted(self, event):
        self.cb.Disable()
        self.dstc.Disable()
        self.t1.SetLabel("Scanning Google Drive to create directory tree. Please Wait...")

    def SyncSetting(self, event):
        if self.cb.GetValue():
            self.dstc.Disable()
            self.sync_model.SetSyncSelection('root')
        else:
            self.dstc.Enable()
            checkedItems = self.dstc.GetCheckedItems()
            for item in checkedItems:
                folder = self.dstc.GetPyData(item)
                self.sync_model.SetSyncSelection(folder)

    def ItemChecked(self, event):
        self.dstc.AutoCheckChild(event.GetItem(), event.GetItem().IsChecked())
        checkedItems = self.dstc.GetCheckedItems()
        self.sync_model.ClearSyncSelection()
        for item in checkedItems:
            folder = self.dstc.GetPyData(item)
            self.sync_model.SetSyncSelection(folder)

        #folder = self.dstc.GetPyData(event.GetItem())
        #if event.GetItem().IsChecked():
        #    self.sync_model.SetSyncSelection(folder)
        #else:
        #    self.sync_model.RemoveSyncSelection(folder)

    def MakeDriveTree(self, gnode, tnode):
        file_list = gnode.GetChildren()
        for f in file_list:
            nnode = self.dstc.AppendItem(tnode, f.GetName(), ct_type=1)
            self.dstc.SetPyData(nnode, f)
            self.MakeDriveTree(f, nnode)

    def GetItemsToBeChecked(self, checklist, itemParent = None, itemToBeChecked = None):
        if itemParent is None:
            itemParent = self.dstc.GetRootItem()

        if itemToBeChecked is None:
            itemToBeChecked = []

        child, cookie = self.dstc.GetFirstChild(itemParent)

        while child:
            child_data = self.dstc.GetPyData(child)
            for d in checklist:
                if child_data.GetId() == d[1]:
                    itemToBeChecked.append(child)

            itemToBeChecked = self.GetItemsToBeChecked(checklist, child, itemToBeChecked)
            child, cookie = self.dstc.GetNextChild(itemParent, cookie)

        return itemToBeChecked

    def RefreshTree(self, event):
        self.Bind(CT.EVT_TREE_ITEM_CHECKED, None)
        driveTree = self.sync_model.GetDriveDirectoryTree()
        self.t1.SetLabel("Choose the directories to sync:")
        self.cb.Enable()
        self.dstc.DeleteAllItems()
        self.dstc_root = self.dstc.AddRoot("Google Drive Root")
        self.MakeDriveTree(driveTree.GetRoot(), self.dstc_root)
        self.dstc.Expand(self.dstc_root)
        sync_list = self.sync_model.GetSyncList()
        for d in sync_list:
            if d[0] == 'root':
                self.cb.SetValue(True)
                self.dstc.Disable()
                self.Bind(CT.EVT_TREE_ITEM_CHECKED, self.ItemChecked)
                return
            else:
                self.cb.SetValue(False)
                self.dstc.Enable()
                self.dstc.SetFocus()
                #break

        item_list = self.GetItemsToBeChecked(sync_list)
        for item in item_list:
            self.dstc.CheckItem(item)
            self.dstc.Expand(item)
        self.Bind(CT.EVT_TREE_ITEM_CHECKED, self.ItemChecked)