'use client'

import { Button } from '@langgenius/dify-ui/button'
import { Dialog, DialogContent } from '@langgenius/dify-ui/dialog'
import { toast } from '@langgenius/dify-ui/toast'
import { RiCloseLine } from '@remixicon/react'
import { useCallback, useMemo, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next'
import AppIcon from '@/app/components/base/app-icon'
import { MARKETPLACE_API_PREFIX } from '@/config'
import {
  fetchMarketplaceTemplateDSL,
  useMarketplaceTemplateDetail,
} from '@/service/marketplace-templates'

type ImportFromMarketplaceTemplateModalProps = {
  templateId: string
  onClose: () => void
  onConfirm: (dslContent: string) => void
}

const ImportFromMarketplaceTemplateModal = ({
  templateId,
  onClose,
  onConfirm,
}: ImportFromMarketplaceTemplateModalProps) => {
  const { t } = useTranslation()
  const { data, isLoading, isError } = useMarketplaceTemplateDetail(templateId)
  const template = data?.data
  const [importing, setImporting] = useState(false)
  const isImportingRef = useRef(false)

  const CATEGORY_I18N_MAP: Record<string, string> = useMemo(
    () => ({
      marketing: t(($) => $['marketplace.template.category.marketing'], { ns: 'app' }),
      sales: t(($) => $['marketplace.template.category.sales'], { ns: 'app' }),
      support: t(($) => $['marketplace.template.category.support'], { ns: 'app' }),
      operations: t(($) => $['marketplace.template.category.operations'], { ns: 'app' }),
      it: t(($) => $['marketplace.template.category.it'], { ns: 'app' }),
      knowledge: t(($) => $['marketplace.template.category.knowledge'], { ns: 'app' }),
      design: t(($) => $['marketplace.template.category.design'], { ns: 'app' }),
    }),
    [t],
  )

  const translateCategory = useCallback(
    (slug: string) => {
      return CATEGORY_I18N_MAP[slug] ?? slug
    },
    [CATEGORY_I18N_MAP],
  )

  const handleConfirm = useCallback(async () => {
    if (isImportingRef.current) return
    isImportingRef.current = true
    setImporting(true)
    try {
      const dsl = await fetchMarketplaceTemplateDSL(templateId)
      onConfirm(dsl)
    } catch {
      toast.error(t(($) => $['marketplace.template.importFailed'], { ns: 'app' }))
    } finally {
      setImporting(false)
      isImportingRef.current = false
    }
  }, [templateId, onConfirm, t])

  return (
    <Dialog
      open
      onOpenChange={(open) => {
        if (!open) onClose()
      }}
    >
      <DialogContent className="w-[520px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg p-0 shadow-xl">
        <div className="flex items-center justify-between pt-6 pr-5 pb-3 pl-6 title-2xl-semi-bold text-text-primary">
          {t(($) => $['marketplace.template.modalTitle'], { ns: 'app' })}
          <div className="flex size-8 cursor-pointer items-center" onClick={onClose}>
            <RiCloseLine className="size-5 text-text-tertiary" />
          </div>
        </div>

        <div className="px-6 py-4">
          {isLoading && (
            <div className="flex items-center justify-center py-8">
              <div className="system-md-regular text-text-tertiary">Loading...</div>
            </div>
          )}

          {isError && (
            <div className="flex items-center justify-center py-8">
              <div className="system-md-regular text-text-destructive">
                {t(($) => $['marketplace.template.fetchFailed'], { ns: 'app' })}
              </div>
            </div>
          )}

          {template && (
            <div className="flex flex-col gap-4">
              <div className="flex items-center gap-3">
                <AppIcon
                  size="large"
                  iconType={template.icon_file_key ? 'image' : 'emoji'}
                  icon={template.icon || 'page_facing_up'}
                  background={template.icon_file_key ? undefined : template.icon_background}
                  imageUrl={
                    template.icon_file_key
                      ? `${MARKETPLACE_API_PREFIX}/templates/${template.id}/icon`
                      : undefined
                  }
                />
                <div className="flex flex-col">
                  <div className="system-md-semibold text-text-primary">
                    {template.template_name}
                  </div>
                  <div className="flex items-center gap-1 system-xs-regular text-text-tertiary">
                    <span>
                      {t(($) => $['marketplace.template.publishedBy'], { ns: 'app' })}{' '}
                      {template.publisher_unique_handle}
                    </span>
                    <span>·</span>
                    <span>
                      {t(($) => $['marketplace.template.usageCount'], { ns: 'app' })}{' '}
                      {template.usage_count}
                    </span>
                  </div>
                </div>
              </div>

              {template.overview && (
                <div className="flex flex-col gap-1">
                  <div className="system-xs-medium-uppercase text-text-tertiary">
                    {t(($) => $['marketplace.template.overview'], { ns: 'app' })}
                  </div>
                  <div className="system-sm-regular text-text-secondary">{template.overview}</div>
                </div>
              )}

              {template.categories.length > 0 && (
                <div className="flex flex-wrap items-center gap-2">
                  {template.categories.map((cat) => (
                    <span
                      key={cat}
                      className="inline-flex items-center rounded-full bg-components-label-gray px-2.5 py-1 system-sm-regular text-text-secondary"
                    >
                      {translateCategory(cat)}
                    </span>
                  ))}
                </div>
              )}
            </div>
          )}
        </div>

        <div className="flex justify-end px-6 py-5">
          <Button className="mr-2" onClick={onClose}>
            {t(($) => $['newApp.Cancel'], { ns: 'app' })}
          </Button>
          <Button
            variant="primary"
            disabled={isLoading || isError || importing}
            loading={importing}
            onClick={handleConfirm}
          >
            {t(($) => $['marketplace.template.importConfirm'], { ns: 'app' })}
          </Button>
        </div>
      </DialogContent>
    </Dialog>
  )
}

export default ImportFromMarketplaceTemplateModal
