package com.cr.cruav

import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.util.DisplayMetrics
import android.util.Log
import android.view.View
import android.view.View.OnClickListener
import android.widget.Switch
import android.widget.TextView
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.cr.common.DataManager
import com.cr.common.DatabaseAppManager
import com.cr.common.DatabaseConfigManager
import com.cr.common.FileManager
import com.cr.data.CrConfig
import com.cr.data.CrUtil
import com.cr.data.CrUtil.Companion.onStart
import com.cr.dialog.DialogNormal
import com.cr.dialog.DialogNormal.DialogNormalListener
import com.cr.event.EventFragmentBarAction
import com.cr.models.UserModel
import com.cr.network.NetManager
import com.cr.network.TCPDataTask
import com.cr.pages.FragmentSetIpAndCom
import com.cr.widget.CrEditTextWidget
import com.squareup.otto.Subscribe
import kotlinx.android.synthetic.main.av_login.*
import org.json.JSONArray

class AvLogin : CrActivity(), OnClickListener {
    // define: 2023/3/31 权限列表
    private val REQUIRED_PERMISSION_LIST: Array<String> = arrayOf(
        Manifest.permission.VIBRATE,  // VARIABLE: 4/8/21
        Manifest.permission.INTERNET,  // VARIABLE: 4/8/21 网路权限
        Manifest.permission.ACCESS_WIFI_STATE,  // VARIABLE: 4/8/21 监测WIFI状态权限
        Manifest.permission.ACCESS_COARSE_LOCATION,  // Maps
        Manifest.permission.ACCESS_NETWORK_STATE,  // VARIABLE: 4/8/21 检测网络状态权限
        Manifest.permission.ACCESS_FINE_LOCATION,  // VARIABLE: 4/8/21 定位权限
        Manifest.permission.CHANGE_WIFI_STATE,  // VARIABLE: 4/8/21 检测Wifi或USB的连接
        Manifest.permission.WRITE_EXTERNAL_STORAGE,  // Log files
        Manifest.permission.BLUETOOTH,  // VARIABLE: 4/8/21 蓝牙权限
        Manifest.permission.BLUETOOTH_ADMIN,  // VARIABLE: 4/8/21 蓝牙权限
        Manifest.permission.READ_EXTERNAL_STORAGE,  // Log files
        Manifest.permission.READ_PHONE_STATE,  // VARIABLE: 4/8/21 读取手机状态权限
        Manifest.permission.RECORD_AUDIO // VARIABLE: 4/8/21 录音权限
    )

    // define: 2023/3/31 动态权限列表
    private val missingPermission = arrayListOf<String>()

    // define: 2023/3/31 权限检测返回码
    private val REQUEST_PERMISSION_CODE: Int = 12345

    // define: 2023/3/30 设置页面
    var fragIpAndCom: FragmentSetIpAndCom? = null

    // define: 2023/4/6 初始化控件
    var lblVersion: TextView? = null
    var txtUserName: CrEditTextWidget? = null
    var txtPassword: CrEditTextWidget? = null
    var switchSavePassword: Switch? = null

    /**
     * 创建视图
     * @param savedInstanceState Bundle?
     */
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.av_login)
        // todo: 2023/4/10 初始化上下文
        this.context = this
        // todo: 2023/3/30 初始化页面
        fragIpAndCom = FragmentSetIpAndCom()
        fragIpAndCom?.let {
            addFragment(it, R.id.av_frm_left_panel)
            hideFragment(it)
        }
        // todo: 2023/4/6 初始化控件
        joinControls()
        // todo: 2023/3/30 注册事件
        registerListener();
        // todo: 2023/3/31 检测权限
        checkAndRequestPermissions()

//        var displayMetrics = DisplayMetrics()
//        var windowManager: WindowManager =
//            this.getSystemService(Context.WINDOW_SERVICE) as WindowManager
//        windowManager.defaultDisplay.getMetrics(displayMetrics)
//        var screenWidth = this.convertPixelsToDp(displayMetrics.widthPixels.toFloat())
//        var screenHeight = this.convertPixelsToDp(displayMetrics.heightPixels.toFloat())
//
//        CrUtil.print("---w:$screenWidth---h:$screenHeight")

        // todo: 2023/4/3 订阅事件
        CrApplication.getEventBus().register(this)
    }

    fun Context.convertPixelsToDp(px: Float): Float {
        val resources = this.resources
        val metrics = resources.displayMetrics
        return px / (metrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)
    }

    /**
     * 重写挂载控件事件
     */
    override fun joinControls() {
        super.joinControls()
        // todo: 2023/4/6 初始化版本信息
        lblVersion = findViewById(R.id.login_version)
        lblVersion?.text = "{${CrUtil.getVersionName(this)}}"
        // todo: 2023/4/6 初始化账号密码
        txtUserName = findViewById(R.id.login_username)
        txtPassword = findViewById(R.id.login_password)
        txtPassword?.setIsPassword(true)
        switchSavePassword = findViewById(R.id.switch_password)
    }

    /**
     * 页面初始化
     */
    private fun initPage() {
        // todo: 2023/4/6 获取存储的用户并显示
        var user: UserModel = DataManager.getUser()
        txtUserName?.setContent(user.userId!!)
        txtPassword?.setContent(user.userPwd!!)
    }

    /**
     * 重写注册事件
     */
    override fun registerListener() {
        super.registerListener()
        // todo: 2023/3/30 挂在开关事件
        switch_password.setOnCheckedChangeListener { compoundButton, b ->
            Log.i(compoundButton.toString(), b.toString());
            switch_password.setSwitchTextAppearance(this, R.style.switch_text_on);
        }
        // todo: 2023/3/30 注册登录事件
        login_btn_login.setOnClickListener(this)
        // todo: 2023/3/30 注册设置事件
        login_btn_set.setOnClickListener(this)
    }

    /**
     * 覆写点击事件
     * @param p0 View
     */
    override fun onClick(p0: View?) {
        when (p0!!.id) {
            R.id.login_btn_login -> {
//                var userName: String? = txtUserName?.checkBlank("请输入账号!") ?: return
//                var passWord: String? = txtPassword?.checkBlank("请输入密码!") ?: return
//                var isSave: Boolean? = switchSavePassword?.isChecked
//                checkUserInfo(userName!!, passWord!!, isSave!!)
                this.finish()
                context!!.onStart<AvMain>()
            }
            R.id.login_btn_set -> {
                fragIpAndCom?.let {
                    it.setBarVisible(isVisible = true)
                    showFragment(it)
                }
            }

        }
    }

    /**
     * 登录验证
     * @param userName String 账号
     * @param password String 密码
     * @param isSave Boolean 是否保存
     */
    private fun checkUserInfo(userName: String, password: String, isSave: Boolean) {
        if (isSave) {
            if (DataManager.saveUser(userName, password)) {
                // todo: 2023/4/10 登录系统
                login(userName, password)
            }
        } else {
            if (DataManager.deleteUser())
            // todo: 2023/4/10 登录系统
                login(userName, password)
        }
    }

    /**
     * 登录系统
     * @param userName String 账号Id
     * @param password String 密码
     */
    private fun login(userName: String, password: String) {
        var user = UserModel(userName, password)
        // todo: 2023/4/10 向服务器发起认证消息
        TCPDataTask.getInstance().sendJSON(
            NetManager.getServerUrl("appQueryUser"),
            user,
            object : TCPDataTask.OnChangeListener {
                // todo: 2023/4/10 成功
                override fun onSuccess(jsonArray: JSONArray) {
                    CrConfig.user = UserModel.toModel(jsonArray.optString(0))
                    context!!.onStart<AvMain>()
                }

                // todo: 2023/4/10 失败
                override fun onFailed(message: String) {
                    showError(message)
                }
            },context,"认证中...")
    }


    /**
     * 检测权限
     */
    private fun checkAndRequestPermissions() {
        for (eachPermission in REQUIRED_PERMISSION_LIST) {
            if (ContextCompat.checkSelfPermission(
                    this,
                    eachPermission
                ) != PackageManager.PERMISSION_GRANTED
            ) {
                missingPermission.add(eachPermission)
            }
        }
        // TODO: 4/8/21 请求缺少的权限
        if (missingPermission.isEmpty()) {
            init()
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            ActivityCompat.requestPermissions(
                (this as Activity?)!!,
                missingPermission.toTypedArray<String>(),
                REQUEST_PERMISSION_CODE
            )
            // todo: 2023/3/31 权限不足 重启App
            DialogNormal(this, "操作提示", "权限检测异常，请手动开启后重启App！", object : DialogNormalListener {
                override fun completion() {
                    checkAndRequestPermissions()
                }

                override fun close() {

                }
            }).show()
        }
    }

    /**
     * 初始化
     */
    private fun init() {
        // todo: 2023/3/31 检查并创建工程文件夹
        if (!FileManager.isExists(CrUtil.PROJECT_PATH)) {
            if (!FileManager.createFolder(CrUtil.PROJECT_PATH)) {
                CrUtil.showMessage("工程文件夹创建失败，请检查权限！")
            }
        }
        // todo: 2023/3/31 检查并创建资源文件夹
        if (!FileManager.isExists(CrUtil.IMAGE_PATH)) {
            if (!FileManager.createFolder(CrUtil.IMAGE_PATH)) {
                CrUtil.showMessage("资源文件夹创建失败，请检查权限！")
            }
        }
        // todo: 2023/3/31 检查并创建缓存文件夹
        if (!FileManager.isExists(CrUtil.PROJECT_CACHE_PATH)) {
            if (!FileManager.createFolder(CrUtil.PROJECT_CACHE_PATH)) {
                CrUtil.showMessage("缓存文件夹创建失败，请检查权限！")
            }
        }
        // todo: 2023/3/31 检查并创建配置文件夹
        if (!FileManager.isExists(CrUtil.CONFIG_PATH)) {
            if (!FileManager.createFolder(CrUtil.CONFIG_PATH)) {
                CrUtil.showMessage("配置文件夹创建失败，请检查权限！")
            }
        }
        // todo: 2023/4/3 拷贝配置库
        FileManager.MoveDataBase(this)
        // todo: 2023/4/3 判断数据库是否存在 存在则启动
        var databaseIsOpen: Boolean = DatabaseAppManager.getInstance().openConfigDatabase()
        // todo: 2023/4/3 最终判断是否可以正常使用App
        if (FileManager.isExists(CrUtil.PROJECT_PATH) && FileManager.isExists(CrUtil.IMAGE_PATH) && FileManager.isExists(
                CrUtil.PROJECT_CACHE_PATH
            ) && FileManager.isExists(CrUtil.CONFIG_PATH) && FileManager.isExists(CrUtil.DATABASE_PATH) && databaseIsOpen
        ) {
            // todo: 2023/4/3 自检通过 可正常使用
            DialogNormal(this, "操作提示", "系统自检通过，可正常使用！").show()
            // todo: 2023/4/13 启动配置库
            DatabaseConfigManager.getInstance().openConfigDatabase()
            // todo: 2023/4/13 启动无人机库

            // todo: 2023/4/6 页面初始化显示
            initPage()
        } else {
            // todo: 2023/4/3 自检异常 重启App自检
            DialogNormal(this, "操作提示", "系统自检异常，请重启App！", object : DialogNormalListener {
                override fun completion() {
                    init()
                }

                override fun close() {

                }
            }).show()
        }
    }

    /**
     * 订阅Fragment管理事件
     * @param event EventFragmentBarAction
     */
    @Subscribe
    fun onFragmentBar(event: EventFragmentBarAction) {
        hideFragment(fragIpAndCom!!)
    }

    // todo: 2023/4/3 生命周期相关方法

    /**
     * 销毁
     */
    override fun onDestroy() {
        CrApplication.getEventBus().unregister(this)
        super.onDestroy()
    }

    /**
     * 重新激活
     */
    override fun onResume() {
        super.onResume()
    }
}
