package com.yorvana.util

import android.net.Uri
import android.provider.DocumentsContract
import com.google.common.truth.Truth.assertThat
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.unmockkStatic
import org.junit.After
import org.junit.Before
import org.junit.Test

class VaultPathHelperTest {
    @Before
    fun setUp() {
        mockkStatic(Uri::class)
        mockkStatic(DocumentsContract::class)
    }

    @After
    fun tearDown() {
        unmockkStatic(Uri::class)
        unmockkStatic(DocumentsContract::class)
    }

    @Test
    fun `uriToDisplayPath should format primary storage path`() {
        val uriString = "content://com.android.externalstorage.documents/tree/primary%3ADocuments%2FYorvana"
        val mockUri = mockk<Uri>()
        every { Uri.parse(uriString) } returns mockUri
        every { DocumentsContract.getTreeDocumentId(mockUri) } returns "primary:Documents/Yorvana"

        val result = VaultPathHelper.uriToDisplayPath(uriString)
        assertThat(result).isEqualTo("/storage/emulated/0/Documents/Yorvana")
    }

    @Test
    fun `uriToDisplayPath should format external storage path`() {
        val uriString = "content://com.android.externalstorage.documents/tree/ABCD-1234%3AYorvana"
        val mockUri = mockk<Uri>()
        every { Uri.parse(uriString) } returns mockUri
        every { DocumentsContract.getTreeDocumentId(mockUri) } returns "ABCD-1234:Yorvana"

        val result = VaultPathHelper.uriToDisplayPath(uriString)
        assertThat(result).isEqualTo("/storage/ABCD-1234/Yorvana")
    }

    @Test
    fun `uriToDisplayPath should return raw id if no colon present`() {
        val uriString = "content://some.provider/some/id"
        val mockUri = mockk<Uri>()
        every { Uri.parse(uriString) } returns mockUri
        every { DocumentsContract.getTreeDocumentId(mockUri) } returns "some-id"

        val result = VaultPathHelper.uriToDisplayPath(uriString)
        assertThat(result).isEqualTo("some-id")
    }

    @Test
    fun `uriToDisplayPath should return input on exception`() {
        val uriString = "malformed-uri"
        every { Uri.parse(uriString) } throws Exception("Failed")

        val result = VaultPathHelper.uriToDisplayPath(uriString)
        assertThat(result).isEqualTo(uriString)
    }

    @Test
    fun `buildSlug should lowercase and replace symbols`() {
        assertThat(VaultPathHelper.buildSlug("My Vehicle!")).isEqualTo("my-vehicle")
        assertThat(VaultPathHelper.buildSlug("  Spaces  ")).isEqualTo("spaces")
        assertThat(VaultPathHelper.buildSlug("")).isEqualTo("vehicle")
    }

    @Test
    fun `generateUniqueSlug should append suffix if already exists`() {
        val existing = setOf("my-car", "my-car-2")
        assertThat(VaultPathHelper.generateUniqueSlug("My Car", existing)).isEqualTo("my-car-3")
        assertThat(VaultPathHelper.generateUniqueSlug("New Car", existing)).isEqualTo("new-car")
    }

    @Test
    fun `sanitizeFilename should replace slashes and null chars`() {
        assertThat(VaultPathHelper.sanitizeFilename("receipt/photo.jpg")).isEqualTo("receipt_photo.jpg")
        assertThat(VaultPathHelper.sanitizeFilename("file\\name\u0000.txt")).isEqualTo("file_name_.txt")
    }

    @Test
    fun `isImageFilename should identify image extensions`() {
        assertThat(VaultPathHelper.isImageFilename("photo.jpg")).isTrue()
        assertThat(VaultPathHelper.isImageFilename("image.PNG")).isTrue()
        assertThat(VaultPathHelper.isImageFilename("doc.pdf")).isFalse()
        assertThat(VaultPathHelper.isImageFilename("no_ext")).isFalse()
    }
}
