<template>
  <div class="bg-background border rounded-lg p-6">
    <div class="flex items-center justify-between mb-4">
      <h3 class="text-lg font-semibold text-foreground">Payment</h3>
      <Badge :variant="getPaymentStatusVariant(paymentStatus)">
        {{ formatPaymentStatus(paymentStatus) }}
      </Badge>
    </div>

    <!-- Invoice Information -->
    <div v-if="invoice" class="space-y-4">
      <!-- Amount and Status -->
      <div class="flex items-center justify-between p-4 bg-muted/50 rounded-lg">
        <div>
          <p class="text-sm text-muted-foreground">Amount</p>
          <p class="text-2xl font-bold text-foreground">
            {{ invoice.amount }} {{ currency }}
          </p>
        </div>
        <div class="text-right">
          <p class="text-sm text-muted-foreground">Status</p>
          <p class="text-lg font-semibold" :class="getStatusColor(paymentStatus)">
            {{ formatPaymentStatus(paymentStatus) }}
          </p>
        </div>
      </div>

      <!-- Lightning Invoice QR Code -->
      <div class="text-center">
        <div class="mb-4">
          <h4 class="font-medium text-foreground mb-2">Lightning Invoice</h4>
          <p class="text-sm text-muted-foreground">Scan with your Lightning wallet to pay</p>
        </div>
        
        <!-- QR Code -->
        <div class="w-48 h-48 mx-auto mb-4">
          <div v-if="qrCodeDataUrl && !qrCodeError" class="w-full h-full">
            <img 
              :src="qrCodeDataUrl" 
              :alt="`QR Code for ${invoice.amount} ${currency} payment`"
              class="w-full h-full border border-border rounded-lg"
            />
          </div>
          <div v-else-if="qrCodeLoading" class="w-full h-full bg-muted rounded-lg flex items-center justify-center">
            <div class="text-center text-muted-foreground">
              <div class="text-4xl mb-2 animate-pulse">⚡</div>
              <div class="text-sm">Generating QR...</div>
            </div>
          </div>
          <div v-else-if="qrCodeError" class="w-full h-full bg-destructive/10 border border-destructive/20 rounded-lg flex items-center justify-center">
            <div class="text-center text-destructive">
              <div class="text-4xl mb-2">⚠️</div>
              <div class="text-sm">{{ qrCodeError }}</div>
              <Button 
                @click="retryQRCode" 
                variant="outline" 
                size="sm" 
                class="mt-2"
              >
                Retry
              </Button>
            </div>
          </div>
          <div v-else class="w-full h-full bg-muted rounded-lg flex items-center justify-center">
            <div class="text-center text-muted-foreground">
              <div class="text-4xl mb-2">⚡</div>
              <div class="text-sm">No invoice</div>
            </div>
          </div>
        </div>

        <!-- QR Code Actions -->
        <div v-if="qrCodeDataUrl && !qrCodeError" class="mb-4">
          <!-- Download button removed -->
        </div>

        <!-- Payment Request -->
        <div class="mb-4">
          <label class="block text-sm font-medium text-foreground mb-2">
            Payment Request
          </label>
          <div class="flex items-center gap-2">
            <Input
              :value="invoice.bolt11"
              readonly
              class="flex-1 font-mono text-sm"
            />
            <Button
              @click="copyPaymentRequest"
              variant="outline"
              size="sm"
            >
              <Copy class="w-4 h-4" />
            </Button>
          </div>
        </div>

        <!-- Copy to Wallet Button -->
        <Button
          @click="openInWallet"
          variant="default"
          class="w-full"
        >
          <Wallet class="w-4 h-4 mr-2" />
          Open in Lightning Wallet
        </Button>
      </div>

      <!-- Payment Details -->
      <div class="border-t pt-4">
        <h4 class="font-medium text-foreground mb-3">Payment Details</h4>
        <div class="space-y-2 text-sm">
          <div class="flex justify-between">
            <span class="text-muted-foreground">Payment Hash:</span>
            <span class="font-mono text-foreground">{{ formatHash(invoice.payment_hash) }}</span>
          </div>
          <div class="flex justify-between">
            <span class="text-muted-foreground">Created:</span>
            <span class="text-foreground">{{ formatDate(invoice.created_at) }}</span>
          </div>
          <div class="flex justify-between">
            <span class="text-muted-foreground">Expires:</span>
            <span class="text-foreground">{{ formatDate(invoice.expiry) }}</span>
          </div>
          <div v-if="paidAt" class="flex justify-between">
            <span class="text-muted-foreground">Paid At:</span>
            <span class="text-foreground">{{ formatDate(paidAt) }}</span>
          </div>
        </div>
      </div>
    </div>

    <!-- No Invoice State -->
    <div v-else class="text-center py-8">
      <div class="w-16 h-16 bg-muted rounded-full flex items-center justify-center mx-auto mb-4">
        <Wallet class="w-8 h-8 text-muted-foreground" />
      </div>
      <h4 class="text-lg font-medium text-foreground mb-2">No Payment Invoice</h4>
      <p class="text-muted-foreground mb-4">
        A Lightning invoice will be sent by the merchant once they process your order.
      </p>
      <p class="text-sm text-muted-foreground">
        You'll receive the invoice via Nostr when it's ready.
      </p>
    </div>

    <!-- Payment Instructions -->
    <div v-if="paymentStatus === 'pending'" class="mt-6 p-4 bg-muted/50 border border-border rounded-lg">
      <div class="flex items-start space-x-3">
        <div class="w-5 h-5 bg-muted rounded-full flex items-center justify-center mt-0.5">
          <Info class="w-3 h-3 text-muted-foreground" />
        </div>
        <div class="text-sm text-muted-foreground">
          <h5 class="font-medium mb-1 text-foreground">Payment Instructions</h5>
          <ul class="space-y-1">
            <li>• Use a Lightning-compatible wallet (e.g., Phoenix, Breez, Alby)</li>
            <li>• Scan the QR code or copy the payment request</li>
            <li>• Confirm the payment amount and send</li>
            <li>• Your order will be processed once payment is confirmed</li>
          </ul>
        </div>
      </div>
    </div>

    <!-- Payment Success -->
    <div v-if="paymentStatus === 'paid'" class="mt-6 p-4 bg-green-50 border border-green-200 rounded-lg">
      <div class="flex items-center space-x-3">
        <div class="w-5 h-5 bg-green-100 rounded-full flex items-center justify-center">
          <CheckCircle class="w-3 h-3 text-green-600" />
        </div>
        <div class="text-sm text-green-800">
          <h5 class="font-medium">Payment Confirmed!</h5>
          <p>Your order is being processed. You'll receive updates via Nostr.</p>
        </div>
      </div>
    </div>
  </div>
</template>

<script setup lang="ts">
import { computed, onMounted, ref, watch } from 'vue'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Badge } from '@/components/ui/badge'
import { 
  Copy, 
  Wallet, 
  Info, 
  CheckCircle
} from 'lucide-vue-next'
import { useMarketStore } from '@/modules/market/stores/market'
import QRCode from 'qrcode'


interface Props {
  orderId: string
}

const props = defineProps<Props>()
const marketStore = useMarketStore()

// Computed properties
const order = computed(() => marketStore.orders[props.orderId])
const invoice = computed(() => order.value?.lightningInvoice)
const paymentStatus = computed(() => order.value?.paymentStatus || 'pending')
const currency = computed(() => order.value?.currency || 'sat')
const paidAt = computed(() => order.value?.paidAt)

// QR Code generation
const qrCodeDataUrl = ref<string | null>(null)
const qrCodeLoading = ref(false)
const qrCodeError = ref<string | null>(null)

const generateQRCode = async (paymentRequest: string) => {
  try {
    qrCodeLoading.value = true
    qrCodeError.value = null
    
    const dataUrl = await QRCode.toDataURL(paymentRequest, {
      width: 192, // 48 * 4 for high DPI displays
      margin: 2,
      color: {
        dark: '#000000',
        light: '#FFFFFF'
      }
    })
    qrCodeDataUrl.value = dataUrl
  } catch (error) {
    console.error('Failed to generate QR code:', error)
    qrCodeError.value = 'Failed to generate QR code'
    qrCodeDataUrl.value = null
  } finally {
    qrCodeLoading.value = false
  }
}

// Methods
const getPaymentStatusVariant = (status: string) => {
  switch (status) {
    case 'paid': return 'default'
    case 'pending': return 'secondary'
    case 'expired': return 'destructive'
    default: return 'outline'
  }
}

const formatPaymentStatus = (status: string) => {
  switch (status) {
    case 'paid': return 'Paid'
    case 'pending': return 'Pending'
    case 'expired': return 'Expired'
    default: return 'Unknown'
  }
}

const getStatusColor = (status: string) => {
  switch (status) {
    case 'paid': return 'text-green-600'
    case 'pending': return 'text-amber-600'
    case 'expired': return 'text-destructive'
    default: return 'text-muted-foreground'
  }
}

const formatHash = (hash: string) => {
  if (!hash) return 'N/A'
  return `${hash.substring(0, 8)}...${hash.substring(hash.length - 8)}`
}

const formatDate = (dateValue: string | number | undefined) => {
  if (!dateValue) return 'N/A'
  
  let timestamp: number
  
  if (typeof dateValue === 'string') {
    // Handle ISO date strings from LNBits API
    timestamp = new Date(dateValue).getTime()
  } else {
    // Handle Unix timestamps (seconds) from our store
    timestamp = dateValue * 1000
  }
  
  return new Date(timestamp).toLocaleString()
}

const copyPaymentRequest = async () => {
  if (!invoice.value?.bolt11) return
  
  try {
    await navigator.clipboard.writeText(invoice.value.bolt11)
    // TODO: Show toast notification
    console.log('Payment request copied to clipboard')
  } catch (error) {
    console.error('Failed to copy payment request:', error)
  }
}

const openInWallet = () => {
  if (!invoice.value?.bolt11) return
  
  // Open in Lightning wallet
  const walletUrl = `lightning:${invoice.value.bolt11}`
  window.open(walletUrl, '_blank')
}

const retryQRCode = () => {
  if (invoice.value?.bolt11) {
    generateQRCode(invoice.value.bolt11)
  }
}

// Lifecycle
onMounted(() => {
  // Set up payment monitoring if invoice exists
  if (invoice.value && props.orderId) {
    // Payment monitoring is handled by the market store
    console.log('Payment display mounted for order:', props.orderId)
    
    // Generate QR code for the invoice
    if (invoice.value.bolt11) {
      generateQRCode(invoice.value.bolt11)
    }
  }
})

// Watch for invoice changes to regenerate QR code
watch(() => invoice.value?.bolt11, (newPaymentRequest) => {
  if (newPaymentRequest) {
    generateQRCode(newPaymentRequest)
  } else {
    qrCodeDataUrl.value = null
  }
}, { immediate: true })
</script>
