/* 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.fenix.addons

import android.net.Uri
import android.text.method.LinkMovementMethod
import android.view.LayoutInflater
import android.view.View
import io.mockk.mockk
import io.mockk.verify
import kotlinx.android.synthetic.main.fragment_add_on_details.view.*
import mozilla.components.feature.addons.Addon
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner

@RunWith(FenixRobolectricTestRunner::class)
class AddonDetailsViewTest {

    private lateinit var view: View
    private lateinit var interactor: AddonDetailsInteractor
    private lateinit var detailsView: AddonDetailsView
    private val baseAddon = Addon(
        id = "",
        translatableDescription = mapOf(
            Addon.DEFAULT_LOCALE to "Some blank addon\nwith a blank line"
        ),
        updatedAt = "2020-11-23T08:00:00Z"
    )

    @Before
    fun setup() {
        view = LayoutInflater.from(testContext).inflate(R.layout.fragment_add_on_details, null)
        interactor = mockk(relaxed = true)

        detailsView = AddonDetailsView(view, interactor)
    }

    @Test
    fun `bind addons rating`() {
        detailsView.bind(baseAddon.copy(
            rating = null
        ))
        assertEquals(0f, view.rating_view.rating)

        detailsView.bind(baseAddon.copy(
            rating = Addon.Rating(
                average = 4.3f,
                reviews = 100
            )
        ))
        assertEquals("4.30/5", view.rating_view.contentDescription)
        assertEquals(4.5f, view.rating_view.rating)
        assertEquals("100", view.users_count.text)
    }

    @Test
    fun `bind addons website`() {
        detailsView.bind(baseAddon.copy(
            siteUrl = "https://mozilla.org"
        ))

        view.home_page_label.performClick()

        verify { interactor.openWebsite(Uri.parse("https://mozilla.org")) }
    }

    @Test
    fun `bind addons last updated`() {
        detailsView.bind(baseAddon)

        assertEquals("Nov 23, 2020", view.last_updated_text.text)
    }

    @Test
    fun `bind addons version`() {
        val addon1 = baseAddon.copy(
            version = "1.0.0",
            installedState = null
        )

        detailsView.bind(addon1)
        assertEquals("1.0.0", view.version_text.text)
        view.version_text.performLongClick()
        verify(exactly = 0) { interactor.showUpdaterDialog(addon1) }

        val addon2 = baseAddon.copy(
            version = "1.0.0",
            installedState = Addon.InstalledState(
                id = "",
                version = "2.0.0",
                optionsPageUrl = null
            )
        )
        detailsView.bind(addon2)
        assertEquals("2.0.0", view.version_text.text)
        view.version_text.performLongClick()
        verify { interactor.showUpdaterDialog(addon2) }
    }

    @Test
    fun `bind addons authors`() {
        val baseAuthor = Addon.Author("", "", "", "")
        detailsView.bind(baseAddon.copy(
            authors = listOf(
                baseAuthor.copy(name = " Sarah Jane"),
                baseAuthor.copy(name = "John Smith ")
            )
        ))

        assertEquals("Sarah Jane, John Smith", view.author_text.text)
    }

    @Test
    fun `bind addons details`() {
        detailsView.bind(baseAddon)

        assertEquals(
            "Some blank addon\nwith a blank line",
            view.details.text.toString()
        )
        assertTrue(view.details.movementMethod is LinkMovementMethod)
    }
}
