package com.yidianling.home.ui.view

import android.content.Context
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.view.View
import android.view.ViewGroup
import android.view.animation.Animation
import android.view.animation.DecelerateInterpolator
import android.view.animation.TranslateAnimation
import android.widget.LinearLayout
import com.yidianling.home.constants.HomeBIConstants
import com.yidianling.home.R
import com.yidianling.home.event.IHomeBaseEvent
import com.yidianling.home.model.bean.HomeHeaderBean
import kotlinx.android.synthetic.ydl.home_real_view_in.view.*
import kotlinx.android.synthetic.ydl.home_real_view_left.view.*
import kotlinx.android.synthetic.ydl.home_real_view_out.view.*

/**
 * @author <a href="https://www.jianshu.com/u/c1e5310dd724">xujian</a>
 * @描述: 首页顶部模块-动态标签模块
 * @Copyright Copyright (c) 2019
 * @Company 壹点灵
 * @date 2019/02/16
 */
class HomePagerBannerRealView(mContext : Context,homeEvent : IHomeBaseEvent) : LinearLayout(mContext){

    private val STATUS_IN = 0
    private val STATUS_OUT = 1
    private var curTipIndex = 0
    private var lastTimeMillis: Long = 0
    private val ANIM_DELAYED_MILLIONS = 2 * 1000
    /**
     * 动画持续时长
     */
    private val ANIM_DURATION = 500
    /**
     * 进、出 两个view (主要用于做动画,其实是两个相同的布局文件)
     */
    private var view_out: View? = null
    private var view_in:View? = null
    /**
     * 进、出 两个View 的动画
     */
    private var anim_out: Animation? = null
    private var anim_in:Animation? = null
    /**
     * 数据缓存
     */
    private var mDataList : List<HomeHeaderBean.HomeSaleDataBean>? = null

    private var homeEvent : IHomeBaseEvent? = null

    private val mHandler: Handler = object : Handler(Looper.getMainLooper()) {
        override fun handleMessage(msg: Message?) {
            super.handleMessage(msg)
            updateTipAndPlayAnimation()
            sendMessageDelayed(Message(), ANIM_DELAYED_MILLIONS.toLong())
        }
    }

    init {
        this.homeEvent = homeEvent
        initView()
        initAnimation()
    }

    /**
     * 界面初始化
     */
    private fun initView() {
        orientation = HORIZONTAL
        var params = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT)
        View.inflate(context, R.layout.home_real_view_left, this)
        view_out = View.inflate(context, R.layout.home_real_view_out,null)
        view_in = View.inflate(context, R.layout.home_real_view_in,null)
        homeModuleRealViewLeftFrameLayout.addView(view_out)
        homeModuleRealViewLeftFrameLayout.addView(view_in)
        layoutParams = params
    }

    private fun initAnimation() {
        anim_out = newAnimation(0f, -1f)
        anim_in = newAnimation(1f, 0f)
        anim_in!!.setAnimationListener(object : Animation.AnimationListener {

            override fun onAnimationStart(animation: Animation) {

            }

            override fun onAnimationRepeat(animation: Animation) {

            }

            override fun onAnimationEnd(animation: Animation) {
                updateViewVisibility()
            }
        })
    }

    /**
     * 设置数据
     */
    fun initData(list: List<HomeHeaderBean.HomeSaleDataBean>?){
        mHandler.removeCallbacksAndMessages(null)
        if (null == list || list.isEmpty()){
            visibility = View.GONE
            return
        }
        visibility = View.VISIBLE
        if (null == mDataList){
            mDataList = ArrayList()
        }else{
            (mDataList as ArrayList).clear()
        }
        (mDataList as ArrayList).addAll(list)
        curTipIndex = 0
        updateTip(STATUS_OUT)
        updateTipAndPlayAnimation()
        mHandler.sendMessageDelayed(Message(), ANIM_DELAYED_MILLIONS.toLong())
    }

    private fun updateViewVisibility() {
        if (curTipIndex % 2 == 0) {
            view_out!!.visibility = View.INVISIBLE
        } else {
            view_in!!.visibility = View.INVISIBLE
        }
    }

    private fun newAnimation(fromYValue: Float, toYValue: Float): Animation {
        val anim = TranslateAnimation(Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f,
                Animation.RELATIVE_TO_SELF, fromYValue, Animation.RELATIVE_TO_SELF, toYValue)
        anim.duration = ANIM_DURATION.toLong()
        anim.interpolator = DecelerateInterpolator()
        return anim
    }

    private fun updateTipAndPlayAnimation() {
        view_in!!.visibility = View.VISIBLE
        view_out!!.visibility = View.VISIBLE
        if (curTipIndex % 2 == 0) {
            updateTip(STATUS_OUT)
            view_in!!.startAnimation(anim_out)
            view_out!!.startAnimation(anim_in)
            this.bringChildToFront(view_in)
        } else {
            updateTip(STATUS_IN)
            view_out!!.startAnimation(anim_out)
            view_in!!.startAnimation(anim_in)
            this.bringChildToFront(view_out)
        }
    }

    private fun updateTip(status : Int){
        val bodyBean = getNextTip() ?: return

        when(status){
            STATUS_IN -> {
                tv_in_doctor_name.text = bodyBean.doctorName
                tv_in_content_before.text = getName(bodyBean)
                tv_in_content_after.text = String.format("老师%s",bodyBean.contentAfter)
                view_in!!.setOnClickListener{
                    homeEvent!!.linkTo(bodyBean.url!!)
                }
            }
            STATUS_OUT -> {
                tv_out_doctor_name.text = bodyBean.doctorName
                tv_out_content_before.text = getName(bodyBean)
                tv_out_content_after.text = String.format("老师%s",bodyBean.contentAfter)
                view_out!!.setOnClickListener{
                    homeEvent!!.linkTo(bodyBean.url!!)
                }
            }
        }
    }

    private fun getName(bean : HomeHeaderBean.HomeSaleDataBean?) : String{
        var nameBuffer = StringBuffer()
        nameBuffer.append(bean?.contentBefore)
        nameBuffer.append(" ")
        nameBuffer.append(bean?.nickName)
        nameBuffer.append(resources.getString(R.string.home_real_appoint))
        return nameBuffer.toString()
    }

    private fun getNextTip() : HomeHeaderBean.HomeSaleDataBean? {
        if (null == mDataList || mDataList!!.isEmpty()){
            return null
        }
        return mDataList!![curTipIndex++ % mDataList!!.size]
    }

    fun onDestory(){
        mHandler.removeCallbacksAndMessages(null)
    }
}