"use client";

import { usePaymentLaunchFlow } from "@/app/_hooks/use-payment-launch-flow";
import { PaymentLaunchDialogs } from "@/app/_components/payment/payment-launch-dialogs";
import type { TipCoffeeType } from "@/lib/tip/tip_coffee";
import {
  usePaymentDispatch,
  usePaymentState,
} from "@/stores/payment/payment-context";
import { Logger } from "@/utils/logger";

import styles from "./tip-screen.module.css";

const log = new Logger("TipCheckoutButton");

export interface TipCheckoutButtonProps {
  coffeeType: TipCoffeeType;
  disabled?: boolean;
  isAuthLoading?: boolean;
  onOrder: () => void;
  returnPath: string;
}

export function TipCheckoutButton({
  coffeeType,
  disabled = false,
  isAuthLoading = false,
  onOrder,
  returnPath,
}: TipCheckoutButtonProps) {
  const payment = usePaymentState();
  const paymentDispatch = usePaymentDispatch();
  const paymentLaunch = usePaymentLaunchFlow({
    log,
    logScope: "tip-checkout",
    payment,
    paymentDispatch,
    subscriptionType: "tip",
    tipCoffeeType: coffeeType,
  });

  const isLoading =
    isAuthLoading || payment.isCreatingOrder || payment.isPollingOrder;
  const label = payment.isPollingOrder
    ? "Processing payment..."
    : payment.isCreatingOrder
      ? "Creating order..."
      : payment.isPaid
        ? "Thanks for the coffee"
        : "Order and Buy";

  return (
    <>
      <button
        type="button"
        data-analytics-key="tip.checkout"
        data-analytics-label="Buy coffee tip"
        className={styles.checkoutButton}
        disabled={disabled || isLoading}
        onClick={onOrder}
      >
        {label}
      </button>
      {payment.errorMessage ? (
        <p className={styles.checkoutError} role="alert">
          {payment.errorMessage}
        </p>
      ) : null}
      <PaymentLaunchDialogs
        currentOrderId={payment.currentOrderId}
        externalCheckoutAnalyticsKey="tip.external_checkout"
        ezpayDescription="Your coffee order is ready. Continue to GCash to finish the payment."
        launch={paymentLaunch}
        stripeReturnPath={returnPath}
      />
    </>
  );
}
