/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.settings.biometrics2.ui.view

import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.ViewModelProvider
import com.android.settings.R
import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFinishViewModel
import com.google.android.setupcompat.template.FooterBarMixin
import com.google.android.setupcompat.template.FooterButton
import com.google.android.setupdesign.GlifLayout

/**
 * Fragment which concludes fingerprint enrollment.
 */
class FingerprintEnrollFinishFragment : Fragment() {

    private var _viewModel: FingerprintEnrollFinishViewModel? = null
    private val viewModel: FingerprintEnrollFinishViewModel
        get() = _viewModel!!

    private val addButtonClickListener =
        View.OnClickListener { _: View? -> viewModel.onAddButtonClick() }

    private val nextButtonClickListener =
        View.OnClickListener { _: View? -> viewModel.onNextButtonClick() }
    override fun onAttach(context: Context) {
        super.onAttach(context)
        _viewModel = ViewModelProvider(requireActivity())[
            FingerprintEnrollFinishViewModel::class.java
        ]
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ) : View = (inflater.inflate(
            if (viewModel.canAssumeSfps())
                R.layout.sfps_enroll_finish
            else
                R.layout.fingerprint_enroll_finish,
            container,
            false
        ) as GlifLayout).also {
            requireActivity().bindFingerprintEnrollFinishFragment(
                view = it,
                isSuw = viewModel.request.isSuw,
                canAssumeSfps = viewModel.canAssumeSfps(),
                isAnotherFingerprintEnrollable = viewModel.isAnotherFingerprintEnrollable,
                nextButtonClickListener = nextButtonClickListener,
                addButtonClickListener = addButtonClickListener
            )
        }
}

fun FragmentActivity.bindFingerprintEnrollFinishFragment(
    view: GlifLayout,
    isSuw: Boolean,
    canAssumeSfps: Boolean,
    isAnotherFingerprintEnrollable: Boolean,
    nextButtonClickListener: View.OnClickListener,
    addButtonClickListener: View.OnClickListener
) {
    GlifLayoutHelper(this, view).apply {
        setHeaderText(R.string.security_settings_fingerprint_enroll_finish_title)
        setDescriptionText(
            getString(
                if (canAssumeSfps && isAnotherFingerprintEnrollable)
                    R.string.security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message
                else
                    R.string.security_settings_fingerprint_enroll_finish_v2_message
            )
        )
    }

    view.getMixin(FooterBarMixin::class.java).also { footer ->
        footer.primaryButton = FooterButton.Builder(this)
            .setText(
                if (isSuw)
                    R.string.next_label
                else
                    R.string.security_settings_fingerprint_enroll_done
            )
            .setListener(nextButtonClickListener)
            .setButtonType(FooterButton.ButtonType.NEXT)
            .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary)
            .build()
        if (isAnotherFingerprintEnrollable) {
            footer.secondaryButton = FooterButton.Builder(this)
                .setText(R.string.fingerprint_enroll_button_add)
                .setListener(addButtonClickListener)
                .setButtonType(FooterButton.ButtonType.SKIP)
                .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
                .build()
        }
    }

}