'use strict'
import effectTypes from './preset'
import { Application } from '../../Application'
import { TransformProptey } from '../proptey'
import { TransformAnimateEvent } from '../../types'

class TransformAnimation extends TransformProptey {
  constructor (app: Application) {
    super(app)
  }

  public getAnimationGroup (): [(e: TransformAnimateEvent) => void | Promise<boolean>, (e: TransformAnimateEvent) => void | Promise<boolean>] | boolean {
    if (!this.modulu || this.modulu.rel !== 'module') return false
    let animationFunction: [(e: TransformAnimateEvent) => void, (e: TransformAnimateEvent) => void] | undefined
    let animationNames = this[this.history === -1 ? 'modulu' : 'module'].config.animation
    if (animationNames === true || animationNames === 'inherit') {
      animationNames = this.options.defaultAnimation
    }
    if (typeof animationNames === 'string') {
      animationFunction = this.getAnimationByName(animationNames)
    } else if (typeof animationNames?.[0] !== 'function') {
      return animationNames as [(e: TransformAnimateEvent) => void | Promise<boolean>, (e: TransformAnimateEvent) => void | Promise<boolean>]
    }

    if (typeof animationFunction?.[0] !== 'function') {
      return false
    }

    return animationFunction
  }

  public getAnimationOneSide (backset: number): ((e: TransformAnimateEvent) => void | Promise<boolean>) | undefined {
    const animationGroup = this.animation
    if (backset >= 0) {
      switch (typeof animationGroup) {
        case 'function':
          return animationGroup
        case 'object':
          return animationGroup[animationGroup.length === 2 ? backset : 0]
        default:
          return
      }
    }
    return
  }

  public getAnimationByName (type: string): [(e: TransformAnimateEvent) => void | Promise<boolean>, (e: TransformAnimateEvent) => void | Promise<boolean>] | undefined {
    switch (type) {
      case 'flip':
        return [effectTypes.flip, effectTypes.flip]
      case 'fade':
        return [effectTypes.fade(1), effectTypes.fade(0)]
      case 'zoom':
        return [effectTypes.zoom(1), effectTypes.zoom(0)]
      case 'slide':
      case 'slideLeft':
      case 'slideleft':
      case 'slide-left':
        return [effectTypes.slide(1), effectTypes.slide(3)]
      case 'slideRight':
      case 'slideright':
      case 'slide-right':
        return [effectTypes.slide(3), effectTypes.slide(1)]
      case 'slideUp':
      case 'slideup':
      case 'slide-up':
        return [effectTypes.slide(0), effectTypes.slide(2)]
      case 'slideDown':
      case 'slidedown':
      case 'slide-down':
        return [effectTypes.slide(2), effectTypes.slide(0)]
      default:
        return
    }
  }
}

export default TransformAnimation
