define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby-button'], function (connectionManager, serverNotifications, events, globalize, EmbyButtonPrototype) {
    'use strict';

    function addNotificationEvent(instance, name, handler) {
        var localHandler = handler.bind(instance);
        events.on(serverNotifications, name, localHandler);
        instance[name] = localHandler;
    }

    function removeNotificationEvent(instance, name) {
        var handler = instance[name];
        if (handler) {
            events.off(serverNotifications, name, handler);
            instance[name] = null;
        }
    }

    function onClick(e) {

        var button = this;
        var id = button.getAttribute('data-id');
        var serverId = button.getAttribute('data-serverid');
        var apiClient = connectionManager.getApiClient(serverId);

        if (!button.classList.contains('playstatebutton-played')) {
            apiClient.markPlayed(apiClient.getCurrentUserId(), id, new Date());
            setState(button, true);
        } else {
            apiClient.markUnplayed(apiClient.getCurrentUserId(), id, new Date());
            setState(button, false);
        }
    }

    function onUserDataChanged(e, apiClient, userData) {
        var button = this;
        if (userData.ItemId === button.getAttribute('data-id')) {
            setState(button, userData.Played);
        }
    }

    function setState(button, played, updateAttribute) {
        var icon = button.iconElement;
        if (!icon) {
            button.iconElement = button.querySelector('.material-icons');
            icon = button.iconElement;
        }

        if (played) {
            button.classList.add('playstatebutton-played');
            if (icon) {
                icon.classList.add('playstatebutton-icon-played');
                icon.classList.remove('playstatebutton-icon-unplayed');
            }
        } else {
            button.classList.remove('playstatebutton-played');
            if (icon) {
                icon.classList.remove('playstatebutton-icon-played');
                icon.classList.add('playstatebutton-icon-unplayed');
            }
        }

        if (updateAttribute !== false) {
            button.setAttribute('data-played', played);
        }
    }

    function setTitle(button, itemType) {

        if (itemType !== 'AudioBook' && itemType !== 'AudioPodcast') {
            button.title = globalize.translate('Watched');
        } else {
            button.title = globalize.translate('Played');
        }

        var text = button.querySelector('.button-text');
        if (text) {
            text.innerHTML = button.title;
        }
    }

    function clearEvents(button) {

        button.removeEventListener('click', onClick);
        removeNotificationEvent(button, 'UserDataChanged');
    }

    function bindEvents(button) {

        clearEvents(button);

        button.addEventListener('click', onClick);
        addNotificationEvent(button, 'UserDataChanged', onUserDataChanged);
    }

    var EmbyPlaystateButtonPrototype = Object.create(EmbyButtonPrototype);

    EmbyPlaystateButtonPrototype.createdCallback = function () {

        // base method
        if (EmbyButtonPrototype.createdCallback) {
            EmbyButtonPrototype.createdCallback.call(this);
        }
    };

    EmbyPlaystateButtonPrototype.attachedCallback = function () {

        // base method
        if (EmbyButtonPrototype.attachedCallback) {
            EmbyButtonPrototype.attachedCallback.call(this);
        }

        var itemId = this.getAttribute('data-id');
        var serverId = this.getAttribute('data-serverid');
        if (itemId && serverId) {

            setState(this, this.getAttribute('data-played') === 'true', false);
            bindEvents(this);
            setTitle(this, this.getAttribute('data-type'));
        }
    };

    EmbyPlaystateButtonPrototype.detachedCallback = function () {

        // base method
        if (EmbyButtonPrototype.detachedCallback) {
            EmbyButtonPrototype.detachedCallback.call(this);
        }

        clearEvents(this);
        this.iconElement = null;
    };

    EmbyPlaystateButtonPrototype.setItem = function (item) {

        if (item) {

            this.setAttribute('data-id', item.Id);
            this.setAttribute('data-serverid', item.ServerId);

            var played = item.UserData && item.UserData.Played;
            setState(this, played);
            bindEvents(this);

            setTitle(this, item.Type);

        } else {

            this.removeAttribute('data-id');
            this.removeAttribute('data-serverid');
            this.removeAttribute('data-played');
            clearEvents(this);
        }
    };

    document.registerElement('emby-playstatebutton', {
        prototype: EmbyPlaystateButtonPrototype,
        extends: 'button'
    });
});
