import { useState } from 'react';
import { AmountDenom, Button, InputNumber } from 'src/components';

import ActionBar from 'src/components/actionBar';
import { useGetBalance } from 'src/containers/sigma/hooks/utils';
import useAdviserTexts from 'src/features/adviser/useAdviserTexts';
import { selectCurrentAddress } from 'src/redux/features/pocket';
import { useAppSelector } from 'src/redux/hooks';
import useDelegate from '../../../hooks/useDelegate';
import useCybernetTexts from '../../../useCybernetTexts';
import useExecuteCybernetContract from '../../../useExecuteCybernetContract';

enum Steps {
  INITIAL,
  STAKE,
  UNSTAKE,
}

type Props = {
  // delegator address
  address: string;
  stakedAmount: number | undefined;
  onSuccess: () => void;
};

function DelegateActionBar({ address, stakedAmount, onSuccess }: Props) {
  const [step, setStep] = useState(Steps.INITIAL);

  const currentAddress = useAppSelector(selectCurrentAddress);

  const query = useDelegate(address);
  const isDelegateExists = !query.loading && !!query?.data;

  const balanceQuery = useGetBalance(currentAddress);
  const availableBalance = balanceQuery.data?.liquid?.amount;

  const { getText } = useCybernetTexts();

  const isOwner = currentAddress === address;

  const [amount, setAmount] = useState(0);

  const { setAdviser } = useAdviserTexts();

  function handleSuccess() {
    setStep(Steps.INITIAL);
    setAmount(0);
    balanceQuery.refetch();
    onSuccess();
  }

  const executeStake = useExecuteCybernetContract({
    query: {
      add_stake: {
        hotkey: address,
      },
    },
    funds: [
      {
        denom: 'pussy',
        amount: String(amount),
      },
    ],
    onSuccess: handleSuccess,
    successMessage: 'Stake has been successfully added',
  });

  const executeUnstake = useExecuteCybernetContract({
    query: {
      remove_stake: {
        hotkey: address,
        amount,
      },
    },
    onSuccess: handleSuccess,
    successMessage: 'Stake has been successfully removed',
  });

  const executeBecomeDelegate = useExecuteCybernetContract({
    query: {
      become_delegate: {
        hotkey: currentAddress,
      },
    },
    // onSuccess: handleSuccess,
    successMessage: `You have successfully became a ${getText('delegate')}`,
  });

  let button;
  let content;
  let onClickBack;

  function handleClickBack() {
    setStep(Steps.INITIAL);
    setAmount(0);
  }

  switch (step) {
    case Steps.INITIAL:
      if (!isDelegateExists) {
        if (isOwner) {
          content = (
            <Button
              onClick={executeBecomeDelegate.mutate}
              pending={executeBecomeDelegate.isLoading}
            >
              Become {getText('delegate')}
            </Button>
          );
        }

        break;
      }

      content = (
        <>
          <Button
            onClick={() => {
              setStep(Steps.STAKE);
            }}
          >
            Stake
          </Button>

          {stakedAmount && (
            <Button
              onClick={() => {
                setStep(Steps.UNSTAKE);
              }}
            >
              Unstake
            </Button>
          )}
        </>
      );

      setAdviser('Stake or unstake');

      break;

    case Steps.STAKE: {
      const { mutate, isReady, isLoading } = executeStake;

      content = (
        <InputNumber
          value={amount}
          disabled={isLoading}
          maxValue={availableBalance}
          onChange={(val) => setAmount(Number(val))}
        />
      );

      onClickBack = handleClickBack;

      setAdviser(
        <div>
          <p>Stake</p>
          {availableBalance >= 0 && (
            <p
              style={{
                display: 'flex',
                gap: '0 7px',
              }}
            >
              Available balance: <AmountDenom amountValue={availableBalance} denom="pussy" />
            </p>
          )}
        </div>
      );

      button = {
        text: 'Stake',
        onClick: mutate,
        disabled: !isReady || amount === 0,
        pending: isLoading,
      };

      break;
    }

    case Steps.UNSTAKE: {
      const { mutate, isReady, isLoading } = executeUnstake;

      content = (
        <InputNumber
          value={amount}
          disabled={isLoading}
          maxValue={stakedAmount}
          onChange={(val) => setAmount(Number(val))}
        />
      );

      onClickBack = handleClickBack;

      setAdviser(
        <div>
          <p>Unstake</p>
          <p
            style={{
              display: 'flex',
              gap: '0 7px',
            }}
          >
            Available balance: <AmountDenom amountValue={stakedAmount} denom="pussy" />
          </p>
        </div>
      );

      button = {
        text: 'Unstake',
        onClick: mutate,
        disabled: !isReady || amount === 0,
        pending: isLoading,
      };

      break;
    }

    default:
      break;
  }

  return (
    <ActionBar onClickBack={onClickBack} button={button}>
      {content}
    </ActionBar>
  );
}

export default DelegateActionBar;

Neighbours