import { useState } from "react";
import {
  getSubscriptionPlans,
  type SubscriptionPlanFilters,
} from "../../services/subscriptionPlanService";
import { customizeToast } from "../../utils";

// Helper function to extract error message from various error response structures
const getErrorMessage = (error: any, defaultMessage: string): string => {
  if (!error) return defaultMessage;

  const errorData = error?.response?.data || error?.data || error;

  // Check for validation errors array (422)
  if (
    errorData?.errors &&
    Array.isArray(errorData.errors) &&
    errorData.errors.length > 0
  ) {
    const firstError = errorData.errors[0];
    return (
      firstError?.message || firstError?.msg || firstError || defaultMessage
    );
  }

  // Check for nested error object
  if (errorData?.error) {
    if (typeof errorData.error === "string") {
      return errorData.error;
    }
    if (errorData.error?.message) {
      return errorData.error.message;
    }
  }

  // Check for message field (multiple possible locations)
  if (errorData?.message) {
    return errorData.message;
  }

  // Check for error string
  if (typeof errorData === "string") {
    return errorData;
  }

  // Check for statusText
  if (error?.response?.statusText) {
    return error.response.statusText;
  }

  // Fallback to error message or default
  return error?.message || defaultMessage;
};

function useSubscriptionPlanService() {
  const [loading, setLoading] = useState(false);

  // Get Subscription Plans
  const getSubscriptionPlansAsync = async (filters?: SubscriptionPlanFilters) => {
    try {
      setLoading(true);
      const response = await getSubscriptionPlans(filters);

      if (response?.data?.success !== false) {
        return {
          success: true,
          data: response.data.data,
          message: response.data?.message || "Subscription plans fetched successfully",
        };
      } else {
        const errorMessage =
          response.data?.message || "Failed to fetch subscription plans";
        customizeToast(errorMessage, "danger");
        return {
          success: false,
          data: null,
          message: errorMessage,
        };
      }
    } catch (error: any) {
      setLoading(false);
      const errorMessage = getErrorMessage(
        error,
        "Failed to fetch subscription plans. Please try again."
      );
      customizeToast(errorMessage, "danger");
      return {
        success: false,
        data: null,
        message: errorMessage,
      };
    } finally {
      setLoading(false);
    }
  };

  return {
    loading,
    getSubscriptionPlans: getSubscriptionPlansAsync,
  };
}

export default useSubscriptionPlanService;

