import { useCallback } from 'react';
import { useAppDispatch, useAppSelector } from './useRedux';
import {
  fetchSubscription,
  startFreeTrial,
  cancelSubscription,
} from '@/store/slices/subscriptionSlice';
import { paymentService } from '@/services/payment.service';
import toast from 'react-hot-toast';
import { ROUTES } from '@/constants';
import { useRouter } from 'next/navigation';
import { isSessionFlow, shouldReturnToMobileAccount } from '@/utils/sessionFlow';

export function useSubscription() {
  const dispatch = useAppDispatch();
  const router = useRouter();
  const { subscription, isLoading, error } = useAppSelector((s) => s.subscription);

  const fetchSub = useCallback(async () => {
    await dispatch(fetchSubscription());
  }, [dispatch]);

  const activateTrial = async () => {
    const result = await dispatch(startFreeTrial());
    if (startFreeTrial.fulfilled.match(result)) {
      toast.success('🎉 Your 3-day free trial has started!');
      router.push(isSessionFlow() ? ROUTES.MOBILE_ACCOUNT : ROUTES.DASHBOARD);
      return true;
    }
    toast.error('Failed to start trial. Please try again.');
    return false;
  };

  const cancel = async () => {
    const result = await dispatch(cancelSubscription());
    if (cancelSubscription.fulfilled.match(result)) {
      toast.success('Subscription cancelled. You keep access until the end of your billing period.');
      return true;
    }
    const message = (result.payload as string) || 'Failed to cancel subscription.';
    toast.error(message);
    return false;
  };

  const checkout = async (planId: string) => {
    try {
      const returnQuery = shouldReturnToMobileAccount() ? '?returnTo=mobile' : '';
      const origin = window.location.origin;
      const successUrl = `${origin}${ROUTES.SUCCESS}${returnQuery}`;
      const cancelUrl = `${origin}${ROUTES.CANCEL}${returnQuery}`;
      const response = await paymentService.createCheckoutSession({
        plan_id: planId,
        success_url: successUrl,
        cancel_url: cancelUrl,
      });
      if (response.data?.url) {
        window.location.href = response.data.url;
      } else {
        toast.error('Unable to start checkout. Please try again.');
      }
    } catch {
      toast.error('Failed to create checkout session. Please try again.');
    }
  };

  const isActive = subscription?.status === 'active';
  const isTrialing = subscription?.status === 'trialing';
  const isCancelled = subscription?.status === 'cancelled';
  const hasAccess = isActive || isTrialing;
  const hasScheduledPlanChange = !!(subscription?.next_plan_id && subscription?.next_plan_start_date);

  return {
    subscription,
    isLoading,
    error,
    isActive,
    isTrialing,
    isCancelled,
    hasAccess,
    hasScheduledPlanChange,
    fetchSub,
    activateTrial,
    cancel,
    checkout,
  };
}
