import type { GitHubRepoReleaseResponse } from '../types'
import { toast } from '@langgenius/dify-ui/toast'
import { uploadGitHub } from '@/service/plugins'
import { compareVersion, getLatestVersion } from '@/utils/semver'

const normalizeAssetName = (downloadUrl: string) => {
  const parts = downloadUrl.split('/')
  return parts[parts.length - 1]
}

const formatReleases = (releases: any) => {
  return releases.map((release: any) => ({
    tag_name: release.tag,
    assets: release.assets.map((asset: any) => ({
      browser_download_url: asset.downloadUrl,
      name: normalizeAssetName(asset.downloadUrl),
    })),
  }))
}

export const fetchReleases = async (owner: string, repo: string) => {
  try {
    // Fetch releases without authentication from client
    const res = await fetch(`https://ungh.cc/repos/${owner}/${repo}/releases`)
    if (!res.ok)
      throw new Error('Failed to fetch repository releases')
    const data = await res.json()
    return formatReleases(data.releases)
  }
  catch (error) {
    if (error instanceof Error) {
      toast.error(error.message)
    }
    else {
      toast.error('Failed to fetch repository releases')
    }
    return []
  }
}

export const checkForUpdates = (fetchedReleases: GitHubRepoReleaseResponse[], currentVersion: string) => {
  let needUpdate = false
  const toastProps: { type?: 'success' | 'error' | 'info' | 'warning', message: string } = {
    type: 'info',
    message: 'No new version available',
  }
  if (fetchedReleases.length === 0) {
    toastProps.type = 'error'
    toastProps.message = 'Input releases is empty'
    return { needUpdate, toastProps }
  }
  const versions = fetchedReleases.map(release => release.tag_name)
  const latestVersion = getLatestVersion(versions)
  try {
    needUpdate = compareVersion(latestVersion!, currentVersion) === 1
    if (needUpdate)
      toastProps.message = `New version available: ${latestVersion}`
  }
  catch {
    needUpdate = false
    toastProps.type = 'error'
    toastProps.message = 'Fail to compare versions, please check the version format'
  }
  return { needUpdate, toastProps }
}

export const handleUpload = async (
  repoUrl: string,
  selectedVersion: string,
  selectedPackage: string,
  onSuccess?: (GitHubPackage: { manifest: any, unique_identifier: string }) => void,
) => {
  try {
    const response = await uploadGitHub(repoUrl, selectedVersion, selectedPackage)
    const GitHubPackage = {
      manifest: response.manifest,
      unique_identifier: response.unique_identifier,
    }
    if (onSuccess)
      onSuccess(GitHubPackage)
    return GitHubPackage
  }
  catch (error) {
    toast.error('Error uploading package')
    throw error
  }
}
