import { ref, computed } from 'vue'
import { defineStore } from 'pinia'
import { fileBrowserClient, type FileBrowserItem } from '@/api/filebrowser-client'

export const useCloudStore = defineStore('cloud', () => {
  const currentPath = ref('/')
  const items = ref<FileBrowserItem[]>([])
  const loading = ref(false)
  const error = ref<string | null>(null)
  const authenticated = ref(false)

  const breadcrumbs = computed(() => {
    const parts = currentPath.value.split('/').filter(Boolean)
    const crumbs = [{ name: 'Home', path: '/' }]
    let path = ''
    for (const part of parts) {
      path += `/${part}`
      crumbs.push({ name: part, path })
    }
    return crumbs
  })

  const sortedItems = computed(() => {
    const dirs = items.value.filter((i) => i.isDir)
    const files = items.value.filter((i) => !i.isDir)
    dirs.sort((a, b) => a.name.localeCompare(b.name))
    files.sort((a, b) => a.name.localeCompare(b.name))
    return [...dirs, ...files]
  })

  async function init(): Promise<boolean> {
    if (authenticated.value) return true
    const ok = await fileBrowserClient.login()
    authenticated.value = ok
    return ok
  }

  async function navigate(path: string): Promise<void> {
    loading.value = true
    error.value = null
    try {
      if (!authenticated.value) {
        const ok = await init()
        if (!ok) {
          error.value = 'Failed to authenticate with File Browser'
          return
        }
      }
      try {
        const result = await fileBrowserClient.listDirectory(path)
        items.value = result
        currentPath.value = path
      } catch {
        // Directory may not exist — try to create it, then retry
        if (path !== '/') {
          try {
            const parentPath = path.substring(0, path.lastIndexOf('/')) || '/'
            const dirName = path.substring(path.lastIndexOf('/') + 1)
            await fileBrowserClient.createFolder(parentPath, dirName)
            const result = await fileBrowserClient.listDirectory(path)
            items.value = result
            currentPath.value = path
          } catch {
            // Fall back to root
            const result = await fileBrowserClient.listDirectory('/')
            items.value = result
            currentPath.value = '/'
          }
        } else {
          throw new Error('Failed to list root directory')
        }
      }
    } catch (e) {
      error.value = e instanceof Error ? e.message : 'Failed to load files'
    } finally {
      loading.value = false
    }
  }

  async function refresh(): Promise<void> {
    await navigate(currentPath.value)
  }

  async function uploadFile(file: File): Promise<void> {
    await fileBrowserClient.upload(currentPath.value, file)
    await refresh()
  }

  async function deleteItem(path: string): Promise<void> {
    await fileBrowserClient.deleteItem(path)
    await refresh()
  }

  function downloadUrl(path: string): string {
    return fileBrowserClient.downloadUrl(path)
  }

  function reset(): void {
    currentPath.value = '/'
    items.value = []
    loading.value = false
    error.value = null
  }

  return {
    currentPath,
    items,
    loading,
    error,
    authenticated,
    breadcrumbs,
    sortedItems,
    init,
    navigate,
    refresh,
    uploadFile,
    deleteItem,
    downloadUrl,
    reset,
  }
})
