#
#       Copyright (C) 2016-
#       Sean Poyser (seanpoyser@gmail.com)
#       Portions Copyright (c) 2020 John Moore
#
#  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 2, 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 XBMC; see the file COPYING.  If not, write to
#  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
#  http://www.gnu.org/copyleft/gpl.html
#

import os
from urllib.parse import unquote, quote, quote_plus

import favourite
import parameters
import utils
import xbmcgui
from utils import DISPLAYNAME

FILENAME  = utils.FILENAME
FOLDERCFG = utils.FOLDERCFG
PROFILE   = utils.PROFILE
GETTEXT   = utils.GETTEXT


def reset():
    xbmcgui.Window(10000).clearProperty('SF_FILE')
    xbmcgui.Window(10000).clearProperty('SF_FOLDER')
    xbmcgui.Window(10000).clearProperty('SF_CMD')
    xbmcgui.Window(10000).clearProperty('SF_LABEL')
    xbmcgui.Window(10000).clearProperty('SF_TYPE')
    xbmcgui.Window(10000).clearProperty('SF_THUMB')
    xbmcgui.Window(10000).clearProperty('SF_FANART')
    xbmcgui.Window(10000).clearProperty('SF_DESCRIPTION')
    xbmcgui.Window(10000).clearProperty('SF_META')


def cutCopy(file, cmd, cut=True):
    reset()
    xbmcgui.Window(10000).setProperty('SF_FILE',   file)
    xbmcgui.Window(10000).setProperty('SF_FOLDER', file.rsplit(os.sep, 1)[0])
    xbmcgui.Window(10000).setProperty('SF_CMD',    cmd)
    xbmcgui.Window(10000).setProperty('SF_TYPE',  'cut' if cut else 'copy')

    fave, index, nFaves = favourite.findFave(file, cmd)

    if index < 0:
        return

    thumb  = fave[1]
    fanart = favourite.getFanart(fave[2])
    desc   = favourite.getOption(fave[2], 'desc')
    meta   = favourite.getOption(fave[2], 'meta')
    meta   = utils.convertURLToDict(meta)

    _setPasteProperties(thumb, fanart, desc, meta=meta)

    return True


def cutCopyFolder(folder, cut=True):
    reset()
    xbmcgui.Window(10000).setProperty(  'SF_FILE',   folder)
    xbmcgui.Window(10000).setProperty(  'SF_FOLDER', folder.rsplit(os.sep, 1)[0])
    xbmcgui.Window(10000).clearProperty('SF_CMD')
    xbmcgui.Window(10000).setProperty(  'SF_TYPE',  'cutfolder' if cut else 'copyfolder')

    file = os.path.join(folder, FOLDERCFG)
    cfg  = parameters.getParams(file)

    thumb  = parameters.getParam('ICON',   cfg)
    fanart = parameters.getParam('FANART', cfg)
    desc   = parameters.getParam('DESC',   cfg)

    _setPasteProperties(thumb, fanart, desc)

    return True


def setPasteProperties(thumb='', fanart='', desc='', label=None, cmd=None, meta=None):
    reset()
    _setPasteProperties(thumb, fanart, desc, label, cmd, meta)


def getThumb():
    return xbmcgui.Window(10000).getProperty('SF_THUMB')


def getFanart():
    return xbmcgui.Window(10000).getProperty('SF_FANART')


def getDesc():
    return  unquote(xbmcgui.Window(10000).getProperty('SF_DESCRIPTION'))


def getMeta():
    return xbmcgui.Window(10000).getProperty('SF_META')


def _setPasteProperties(thumb='', fanart='', desc='', label=None, cmd=None, meta=None):
    if not thumb:  thumb  = ''
    if not fanart: fanart = ''
    if not desc:   desc   = ''
    if not cmd:    cmd    = ''
    if not label:  label  = ''
    if not meta:   meta   = ''

    xbmcgui.Window(10000).setProperty('SF_THUMB',       thumb)
    xbmcgui.Window(10000).setProperty('SF_FANART',      fanart)
    xbmcgui.Window(10000).setProperty('SF_DESCRIPTION', quote(desc))
    xbmcgui.Window(10000).setProperty('SF_LABEL',       label)
    xbmcgui.Window(10000).setProperty('SF_META',        utils.convertDictToURL(meta))

    if len(xbmcgui.Window(10000).getProperty('SF_TYPE')) > 0:
        return

    xbmcgui.Window(10000).setProperty('SF_TYPE', 'capture')
    xbmcgui.Window(10000).setProperty('SF_CMD',  cmd)


def paste(folder):
    if len(folder) < 1:
        return False

    file = xbmcgui.Window(10000).getProperty('SF_FILE')
    cmd  = xbmcgui.Window(10000).getProperty('SF_CMD')
    type = xbmcgui.Window(10000).getProperty('SF_TYPE').lower()

    dst = os.path.join(folder, FILENAME)

    if type == 'cut':
        return pasteCut(file, cmd, folder)
    elif type == 'copy':
        return pasteCopy(file, cmd, folder)
    elif type == 'capture':
        return pasteCapture(cmd, folder)

    return False


def pasteCapture(cmd, folder):
    thumb = xbmcgui.Window(10000).getProperty('SF_THUMB')
    name  = xbmcgui.Window(10000).getProperty('SF_LABEL')

    file = os.path.join(folder, FILENAME)

    copy = [name, thumb, cmd]
    return favourite.addFave(file, copy)


def pasteFolder(dst, addonid):
    if len(dst) == 0:
        return False

    src = xbmcgui.Window(10000).getProperty('SF_FILE')
    cut = xbmcgui.Window(10000).getProperty('SF_TYPE').lower() == 'cutfolder'

    root       = src.rsplit(os.sep, 1)[0]
    folderName = src.rsplit(os.sep, 1)[-1]

    same = (root == dst)

    link = True

    if dst == 'special://profile': #i.e. Kodi favourites
        if cut:
            cut   = False
            line1 = GETTEXT(30187) % DISPLAYNAME
            line2 = GETTEXT(30188) % folderName
            line3 = GETTEXT(30189)
            link  = utils.DialogYesNo(line1, line2, line3, noLabel=GETTEXT(30190), yesLabel=GETTEXT(30186))
            if not link:
                return
    else:
        if cut:
            link = False
        else:  
            line1 = GETTEXT(30183) % folderName
            link  = True if same else utils.DialogYesNo(line1, GETTEXT(30184), noLabel=GETTEXT(30185), yesLabel=GETTEXT(30186))

    if link:
        success = pasteFolderLink(src, dst, folderName, addonid)
    else:
        success = pasteFolderCopy(src, dst, folderName)

    if not success:
        line1 = GETTEXT(30191) % folderName
        utils.DialogOK(line1)
        return False

    if cut:
        import sfile
        sfile.rmtree(src)

    return success


def pasteFolderLink(src, dst, folderName, addonid):
    thumbnail, fanart = utils.getFolderThumb(src)

    folderConfig = os.path.join(src, FOLDERCFG)
    colour       = parameters.getParam('COLOUR', folderConfig)

    if colour:
        folderName = '[COLOR %s]%s[/COLOR]' % (colour, folderName)

    path = utils.convertToHome(src)
    path = path.replace(PROFILE, '')
    path = path.replace('\\', '/')
    if path.startswith('/'):
        path = path[1:]

    cmd = '%s?label=%s&mode=%d&folder=%s' % (addonid, folderName, utils._FOLDER, quote_plus(path))
    cmd = '"%s"' % cmd  
    cmd = cmd.replace('+', '%20')
    cmd = 'ActivateWindow(%d,%s)' % (utils.getCurrentWindowId(), cmd) 
    cmd = favourite.addFanart(cmd, fanart)

    file = os.path.join(dst, FILENAME)

    if favourite.findFave(file, cmd)[0]:
        return True

    faves = favourite.getFavourites(file, validate=False)
    fave  = [folderName, thumbnail, cmd]

    faves.append(fave)

    favourite.writeFavourites(file, faves)

    return True


def pasteFolderCopy(src, _dst, folderName):
    import sfile

    dst = os.path.join(_dst, folderName)

    index = 0
    while sfile.exists(dst):
        index += 1
        dst    = os.path.join(_dst, GETTEXT(30192) % (folderName, index))

    try:
        sfile.copytree(src, dst)
    except Exception as e:
        utils.log('Error in pasteFolderCopy: %s' % str(e))
        return False

    return True


def pasteCopy(file, cmd, folder):
    copy, index, nFaves = favourite.findFave(file, cmd)
    if not copy:
        return False

    file = os.path.join(folder, FILENAME)

    return favourite.copyFave(file, copy)


def pasteCut(file, cmd, folder):
    if not pasteCopy(file, cmd, folder):
        return False

    return favourite.removeFave(file, cmd)