import {css, html, LitElement} from 'lit'

const TRANSITION_EVENT_NAMES = ['transitionend', 'webkitTransitionEnd', 'oTransitionEnd', 'MSTransitionEnd']

let rippleElement

class LoadingRipple extends LitElement {
    static get properties () {
        return {
            welcomeMessage: {
                type: String,
                attribute: 'welcome-message',
                reflectToAttribute: true
            },
            loadingMessage: {
                type: String,
                attribute: 'loading-message',
                reflectToAttribute: true
            }
        }
    }

    constructor () {
        super()
        this.welcomeMessage = ''
        this.loadingMessage = ''
    }

    static get styles () {
        return css`
            * {
                --mdc-theme-primary: rgb(3, 169, 244);
                --mdc-theme-secondary: var(--mdc-theme-primary);
                --paper-spinner-color: var(--mdc-theme-secondary);
            }

            #rippleWrapper{
                position:fixed;
                top:0;
                left:0;
                bottom:0;
                right:0;
                height:0;
                width:0;
                z-index:999;
                overflow: visible;
                --ripple-activating-transition: transform 0.3s cubic-bezier(0.6, 0.0, 1, 1), opacity 0.3s cubic-bezier(0.6, 0.0, 1, 1);
                --ripple-disable-transition: opacity 0.5s ease;
            }
            #ripple {
                border-radius:50%;
                border-width:0;
                margin-left:-100vmax;
                margin-top: -100vmax;
                height:200vmax;
                width:200vmax;
                overflow:hidden;
                background: var(--black);
                transform: scale(0);
                overflow:hidden;
            }
            #ripple.error {
                transition: var(--ripple-activating-transition);
                background: var(--mdc-theme-error)
            }
            #rippleShader {
                background: var(--white);
                opacity:0;
                height:100%;
                width:100%;
            }
            #ripple.activating{
                transition: var(--ripple-activating-transition);
                transform: scale(1)
            }
            .activating #rippleShader {
                transition: var(--ripple-activating-transition);
                opacity: 1;
            }
            #ripple.disabling{
                transition: var(--ripple-disable-transition);
                opacity: 0;
            }
            #rippleContentWrapper {
                position: absolute;
                top:100vmax;
                left:100vmax;
                height:var(--window-height);
                width:100vw;
                display: flex;
                align-items: center;
                justify-content: center;
            }
            #rippleContent {
                opacity: 0;
                text-align:center;
            }
            .activating-done #rippleContent {
                opacity: 1;
                transition: var(--ripple-activating-transition);
            }

        `
    }

    render () {
        return html`
        <div id="rippleWrapper">
            <div id="ripple">
                <div id="rippleShader"></div>
                <div id="rippleContentWrapper">
                    <div id="rippleContent">
                        <h1 style="color: var(--black);">${this.welcomeMessage}</h1>
                        <paper-spinner-lite active></paper-spinner-lite>
                        <p style="color: var(--black);">${this.loadingMessage}</p>
                    </div>
                </div>
            </div>
        </div>
        `
    }

    firstUpdated () {
        this._rippleWrapper = this.shadowRoot.getElementById('rippleWrapper')
        this._ripple = this.shadowRoot.getElementById('ripple')
        this._rippleContentWrapper = this.shadowRoot.getElementById('rippleContentWrapper')
    }

    // duh
    open (origin) {
        this._rippleWrapper.style.top = origin.y + 'px'
        this._rippleWrapper.style.left = origin.x + 'px'
        this._rippleContentWrapper.style.marginTop = -origin.y + 'px'
        this._rippleContentWrapper.style.marginLeft = -origin.x + 'px'

        return new Promise((resolve, reject) => {
            this._ripple.classList.add('activating')
            let isOpened = false
            const doneOpeningEvent = () => {
                if (isOpened) return
                // Clear events
                TRANSITION_EVENT_NAMES.forEach(name => this._ripple.removeEventListener(name, doneOpeningEvent))
                this._ripple.classList.add('activating-done')
                isOpened = true
                resolve()
            }
            TRANSITION_EVENT_NAMES.forEach(name => this._ripple.addEventListener(name, doneOpeningEvent))
        })
    }

    // Fades out
    fade () {
        return new Promise((resolve, reject) => {
            // CAN'T FADE OUT CAUSE THE STUPID THING GETS KILLED CAUSE OF STATE.APP.LOGGEEDIN
            // let rippleClosed = false
            this._ripple.classList.remove('activating')
            this._ripple.classList.remove('activating-done')
            this._ripple.classList.remove('disabling')
            resolve()
        })
    }

    // un-ripples...
    close () {
        return new Promise((resolve, reject) => {
            let rippleClosed = false
            this._ripple.classList.add('error')
            this._ripple.classList.remove('activating')
            this._ripple.classList.remove('activating-done')
            const rippleClosedEvent = () => {
                if (rippleClosed) return
                rippleClosed = true
                TRANSITION_EVENT_NAMES.forEach(name => this._ripple.removeEventListener(name, rippleClosedEvent))
                // Reset the ripple
                this._ripple.classList.remove('error')
                this.rippleIsOpen = false
                resolve()
            }
            TRANSITION_EVENT_NAMES.forEach(name => this._ripple.addEventListener(name, rippleClosedEvent))
        })
    }

    stateChanged (state) {
        // this.loggedIn = state.app.loggedIn
    }
}

window.customElements.define('loading-ripple', LoadingRipple)

const rippleNode = document.createElement('loading-ripple')
rippleNode.id = 'ripple-node'
rippleNode.loadingMessage = ''
rippleElement = document.body.appendChild(rippleNode)
setTimeout(() => {
    const ripple = document.getElementById('ripple-node')
    const mainApp = document.getElementById('main-app')
    const shadow = mainApp.shadowRoot
    // console.log(shadow)
    rippleElement = shadow.appendChild(ripple)
}, 500) // Should just keep checking for the main-app and it's shadow and then append once it's there
export default rippleElement