package com.duolebo.blyrobot.service

import android.annotation.SuppressLint
import android.app.Service
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.IBinder
import android.support.v4.content.LocalBroadcastManager
import android.util.Log
import com.duolebo.blyrobot.data.ApkInfo
import com.duolebo.blyrobot.data.Task
import com.duolebo.blyrobot.tools.TaskManager
import com.duolebo.blyrobot.util.AdbUtil
import com.duolebo.blyrobot.util.AppUtil
import com.duolebo.blyrobot.util.Config
import com.duolebo.blyrobot.util.Constants
import org.json.JSONObject
import java.util.*

@SuppressLint("Registered")
class BylRobotService: Service() {

    private val TAG = "BylRobotService"
    private var timer: Timer? = null
    private var count = 0

    private val broadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(p0: Context?, intent: Intent?) {
            if (intent != null) {
                val cmd = intent.getStringExtra(Constants.KEY_CMD)
                when (cmd) {
                    Constants.CMD_START -> loadTask()
                    Constants.CMD_STOP -> stopTask()
                }
            }
        }
    }

    override fun onCreate() {
        super.onCreate()
        initBroadcast()
        timer = Timer()

        timer!!.schedule(object: TimerTask() {
            override fun run() {
//                testKey()
//                testCapture()
//                screenShot()
                count++
                if (count > 2) {
                    cancelTimer()
//                    proc?.destroy()
                }
            }
        },2000, 180*1000)
    }

    private fun initBroadcast() {
        Log.i(TAG, "initBroadcast...")
        val intentFilter = IntentFilter(Constants.ACTION_LOCAL_SERVICE)
        LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, intentFilter)
    }

    private fun loadTask() {
        Log.i(TAG, "loadTask...")

        if (Config.instance.isDebug) {
            val task = Task(this)
            val apkInfo = ApkInfo()
            val apkJson = JSONObject(AppUtil.readFromAssert(this, "test.json"))
            apkInfo.from(apkJson)
            task.from(apkInfo)
            TaskManager.instance.add(task)
        }

        TaskManager.instance.start()
    }

    private fun stopTask() {
        TaskManager.instance.stop()
    }

    private fun testKey() {
        Thread(Runnable {
            AdbUtil.sendMultiKey("down/up/right")
        }).start()
    }

    var proc: Process ?= null
    private fun testCapture() {
        proc?.destroy()
        Thread(Runnable {
            AdbUtil.killTcpdump()
        }).start()
        Thread.sleep(3000)
        Thread(Runnable {
            proc = AdbUtil.tcpCapture("")
        }).start()
    }

    private fun cancelTimer() {
        timer?.cancel()
        timer = null
    }

    override fun onBind(p0: Intent?): IBinder {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun onDestroy() {
        Log.i(TAG, "destroy...")
        super.onDestroy()
        LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver)
        cancelTimer()
    }
}