package  com.base.pdfviewerscannerwhite.service

import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.Service
import android.content.Context
import android.content.Intent
import android.content.pm.ServiceInfo
import android.graphics.BitmapFactory
import android.graphics.drawable.Icon
import android.os.Build
import android.os.IBinder
import android.provider.MediaStore
import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
import androidx.core.graphics.drawable.IconCompat
import com.base.pdfviewerscannerwhite.R
import com.base.pdfviewerscannerwhite.bean.ConstObject
import com.base.pdfviewerscannerwhite.helper.EventUtils
import com.base.pdfviewerscannerwhite.helper.MyApplication
import com.base.pdfviewerscannerwhite.ui.main.MainActivity
import com.base.pdfviewerscannerwhite.ui.splash.SplashActivity
import com.base.pdfviewerscannerwhite.utils.LogEx
import com.cherry.lib.doc.office.system.IFind
import kotlin.random.Random


/**
 *  常驻通知栏
 */
class StayNotificationService : Service() {

    private val TAG = "StayNotificationService"

    companion object {

        var isRunning = false

        fun Context.startStayNotification() {
            if (isRunning) return

            val intent = Intent(this, StayNotificationService::class.java)
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) {
                return
            }

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                startForegroundService(intent)
            } else {
                startService(intent)
            }
        }

        fun Context.restartStartStayNotification() {
            val intent = Intent(this, StayNotificationService::class.java)
            stopService(intent)

            startStayNotification()
        }


        fun createPermanentNotification(context: Context): Notification {

            val channelName = "PDF Reader Foreground Service Channel"
            val channelId = "PDF_Reader_Service_Id"
            val contentView = RemoteViews(context.packageName, R.layout.stay_notification_small)
            val expendView = RemoteViews(context.packageName, R.layout.stay_notification_big)

            val requestCode1 = Random.nextInt(1800)
            val intent1 = Intent(context, SplashActivity::class.java).apply {
                putExtra("actionId", ConstObject.NOTIFICATION_ACTION_LOG)
            }
            val pendingIntent1 =
                PendingIntent.getActivity(
                    context,
                    requestCode1,
                    intent1,
                    PendingIntent.FLAG_IMMUTABLE
                )
            contentView.setOnClickPendingIntent(R.id.fl_1, pendingIntent1)
            expendView.setOnClickPendingIntent(R.id.fl_1, pendingIntent1)

            val requestCode2 = Random.nextInt(1800)
            val intent2 = Intent(context, SplashActivity::class.java).apply {
                putExtra("actionId", ConstObject.NOTIFICATION_ACTION_DOCUMENT)
            }
            val pendingIntent2 =
                PendingIntent.getActivity(
                    context,
                    requestCode2,
                    intent2,
                    PendingIntent.FLAG_IMMUTABLE
                )
            contentView.setOnClickPendingIntent(R.id.ll_2, pendingIntent2)
            expendView.setOnClickPendingIntent(R.id.ll_2, pendingIntent2)

            val requestCode3 = Random.nextInt(1800)
            val intent3 = Intent(context, SplashActivity::class.java).apply {
                putExtra("actionId", ConstObject.NOTIFICATION_ACTION_BOOKMARK)
            }
            val pendingIntent3 =
                PendingIntent.getActivity(
                    context,
                    requestCode3,
                    intent3,
                    PendingIntent.FLAG_IMMUTABLE
                )
            contentView.setOnClickPendingIntent(R.id.ll_3, pendingIntent3)
            expendView.setOnClickPendingIntent(R.id.ll_3, pendingIntent3)

            val builder = NotificationCompat.Builder(context, channelId)
            val smallIcon = IconCompat.createFromIcon(
                context, Icon.createWithResource(
                    MyApplication.context, R.mipmap.logo
                )
            )
            smallIcon?.let {
                builder.setSmallIcon(smallIcon) //设置状态栏内的小图标
            }

            val nfIntent = Intent(context, MainActivity::class.java)
            val pendingIntent =
                PendingIntent.getActivity(context, 0, nfIntent, PendingIntent.FLAG_IMMUTABLE)
            builder.setLargeIcon(BitmapFactory.decodeResource(context.resources, R.mipmap.logo))
            builder.setContentTitle(context.resources.getString(R.string.app_name))
            builder.setContentIntent(pendingIntent) //设置PendingIntent
            builder.setVisibility(NotificationCompat.VISIBILITY_PRIVATE) //设置通知公开可见
            builder.setAutoCancel(false)
            builder.setPriority(NotificationCompat.PRIORITY_MAX) //优先级为：重要通知
            builder.setWhen(System.currentTimeMillis())
            builder.setCustomContentView(contentView)
            builder.setCustomBigContentView(expendView)

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                val channel =
                    NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_LOW)
                channel.lockscreenVisibility = 1
                val notificationManager =
                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                notificationManager.createNotificationChannel(channel)
                builder.setChannelId(channelId)
            }
            return builder.build()
        }

    }


    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        LogEx.logDebug(TAG, "onStartCommand intent=$intent")
        if (intent == null) {
            EventUtils.event("onStartCommand", "Foreground System auto launch intent=null isRunning=$isRunning")
            return START_NOT_STICKY
        }
        if (!isRunning) {
            LogEx.logDebug(TAG, "onStartCommand startForeground")
            startForeground()


            //监听媒体库变化
            observerMediaContentObserver()

            isRunning = true
        }

        return START_STICKY
    }

    private fun startForeground() {
        val notification = createPermanentNotification(MyApplication.context)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            startForeground(100, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC)
        } else {
            startForeground(100, notification)
        }
        isRunning = true
    }


    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

    override fun onDestroy() {
        isRunning = false
        super.onDestroy()
    }


    private var mediaContentObserver: MediaContentObserver? = null

    private fun observerMediaContentObserver() {
        if (mediaContentObserver == null) {
            LogEx.logDebug(TAG, "observerMediaContentObserver")
            mediaContentObserver = MediaContentObserver(this)
            mediaContentObserver?.let {
                this.contentResolver.registerContentObserver(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, it
                )
            }

        }
    }

}