// Pro Access Hook
// Kullanıcının pro componentlere erişim durumunu kontrol eder

import React from 'react'
import { useSession } from 'next-auth/react'
import { useQuery } from '@tanstack/react-query'
import { getComponentAccess } from '@/lib/component-metadata'

interface UserSubscription {
  userId: string
  plan: 'free' | 'pro_monthly' | 'pro_annual' | 'pro_lifetime'
  status: 'active' | 'expired' | 'cancelled' | 'trial'
  expiresAt: Date | null // lifetime için null
  createdAt: Date
  updatedAt: Date
}

interface ProAccessStatus {
  hasProAccess: boolean
  subscription: UserSubscription | null | undefined
  isLoading: boolean
  error: Error | null
  daysUntilExpiry: number | null
}

// Subscription durumunu API'den çek
async function fetchSubscriptionStatus(): Promise<UserSubscription | null> {
  const response = await fetch('/api/user/subscription-status')
  
  if (!response.ok) {
    throw new Error('Subscription status fetch failed')
  }
  
  const data = await response.json()
  return data.subscription
}

// Pro erişim durumunu hesapla
function calculateProAccess(subscription: UserSubscription | null | undefined): {
  hasProAccess: boolean
  daysUntilExpiry: number | null
} {
  if (!subscription) {
    return { hasProAccess: false, daysUntilExpiry: null }
  }

  // Lifetime üyelik
  if (subscription.plan === 'pro_lifetime') {
    return { hasProAccess: true, daysUntilExpiry: null }
  }

  // Aktif olmayan subscription
  if (subscription.status !== 'active') {
    return { hasProAccess: false, daysUntilExpiry: null }
  }

  // Süre kontrolü
  if (subscription.expiresAt) {
    const now = new Date()
    const expiryDate = new Date(subscription.expiresAt)
    const daysUntilExpiry = Math.ceil((expiryDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24))
    
    return {
      hasProAccess: daysUntilExpiry > 0,
      daysUntilExpiry: daysUntilExpiry > 0 ? daysUntilExpiry : 0
    }
  }

  return { hasProAccess: false, daysUntilExpiry: null }
}

export function useProAccess(): ProAccessStatus {
  const { data: session, status } = useSession()
  
  const {
    data: subscription,
    isLoading,
    error
  } = useQuery({
    queryKey: ['subscription-status', session?.user?.id],
    queryFn: fetchSubscriptionStatus,
    enabled: !!session?.user?.id && status === 'authenticated',
    staleTime: 5 * 60 * 1000, // 5 dakika cache
    refetchInterval: 10 * 60 * 1000, // 10 dakikada bir otomatik refresh
  })

  const { hasProAccess, daysUntilExpiry } = calculateProAccess(subscription)

  return {
    hasProAccess,
    subscription,
    isLoading: status === 'loading' || isLoading,
    error: error as Error | null,
    daysUntilExpiry
  }
}

// Component erişim kontrolü için helper hook
export function useComponentAccess(componentId: string) {
  const { hasProAccess, isLoading } = useProAccess()
  
  const access = React.useMemo(() => {
    return getComponentAccess(componentId, hasProAccess ? 'pro' : 'free')
  }, [componentId, hasProAccess])
  
  return {
    ...access,
    isLoading,
    canUse: access.access === 'unlocked',
    isLocked: access.access === 'locked'
  }
}

// Subscription durumu için utility functions
export function getSubscriptionDisplayName(plan: string): string {
  switch (plan) {
    case 'pro_monthly':
      return 'Pro Monthly'
    case 'pro_annual':
      return 'Pro Annual'
    case 'pro_lifetime':
      return 'Pro Lifetime'
    default:
      return 'Free'
  }
}

export function getSubscriptionColor(status: string): string {
  switch (status) {
    case 'active':
      return 'green'
    case 'trial':
      return 'blue'
    case 'expired':
      return 'red'
    case 'cancelled':
      return 'gray'
    default:
      return 'gray'
  }
}
