/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package org.mozilla.focus.activity

import android.content.Context
import android.os.Bundle
import android.util.AttributeSet
import android.view.View
import androidx.activity.OnBackPressedCallback
import mozilla.components.browser.state.selector.findCustomTab
import mozilla.components.concept.engine.EngineView
import mozilla.components.support.utils.SafeIntent
import org.mozilla.focus.R
import org.mozilla.focus.ext.components
import org.mozilla.focus.ext.updateSecureWindowFlags
import org.mozilla.focus.fragment.BrowserFragment
import org.mozilla.focus.telemetry.startuptelemetry.StartupPathProvider
import org.mozilla.focus.telemetry.startuptelemetry.StartupTypeTelemetry

/**
 * The main entry point for "custom tabs" opened by third-party apps.
 */
class CustomTabActivity : EdgeToEdgeActivity() {
    private lateinit var customTabId: String
    private lateinit var browserFragment: BrowserFragment

    private val startupPathProvider = StartupPathProvider()
    private lateinit var startupTypeTelemetry: StartupTypeTelemetry

    override fun onCreate(savedInstanceState: Bundle?) {
        updateSecureWindowFlags()
        super.onCreate(savedInstanceState)

        val intent = SafeIntent(intent)
        val customTabId = intent.getStringExtra(CUSTOM_TAB_ID)

        // The session for this ID, no longer exists. This usually happens because we were gc-d
        // and since we do not save custom tab sessions, the activity is re-created and we no longer
        // have a session with us to restore. It's safer to finish the activity instead.
        if (customTabId == null || components.store.state.findCustomTab(customTabId) == null) {
            finish()
            return
        }

        this.customTabId = customTabId

        setContentView(R.layout.activity_customtab)

        if (savedInstanceState == null || !this::browserFragment.isInitialized) {
            browserFragment = BrowserFragment.createForTab(customTabId)
            supportFragmentManager.beginTransaction()
                .add(R.id.container, browserFragment)
                .commit()
        }

        startupPathProvider.attachOnActivityOnCreate(lifecycle, intent.unsafe)
        startupTypeTelemetry = StartupTypeTelemetry(components.startupStateProvider, startupPathProvider).apply {
            attachOnMainActivityOnCreate(lifecycle)
        }

        onBackPressedDispatcher.addCallback(
            this,
            object : OnBackPressedCallback(true) {
                override fun handleOnBackPressed() {
                    browserFragment.onBackPressed()
                }
            },
        )
    }

    override fun onPause() {
        super.onPause()

        if (isFinishing) {
            components.customTabsUseCases.remove(customTabId)
        }
    }

    override fun onCreateView(parent: View?, name: String, context: Context, attrs: AttributeSet): View? {
        return if (name == EngineView::class.java.name) {
            val engineView = components.engine.createView(context, attrs)
            engineView.asView()
        } else {
            super.onCreateView(parent, name, context, attrs)
        }
    }

    companion object {
        const val CUSTOM_TAB_ID = "custom_tab_id"
    }
}
