package com.eletac.tronwallet.block_explorer.contract;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;

import com.eletac.tronwallet.R;
import com.eletac.tronwallet.block_explorer.contract.contract_type_fragments.AccountUpdateContractFragment;
import com.eletac.tronwallet.block_explorer.contract.contract_type_fragments.AssetIssueContractFragment;
import com.eletac.tronwallet.block_explorer.contract.contract_type_fragments.FreezeContractFragment;
import com.eletac.tronwallet.block_explorer.contract.contract_type_fragments.ParticipateAssetIssueContractFragment;
import com.eletac.tronwallet.block_explorer.contract.contract_type_fragments.TransferAssetContractFragment;
import com.eletac.tronwallet.block_explorer.contract.contract_type_fragments.TransferContractFragment;
import com.eletac.tronwallet.block_explorer.contract.contract_type_fragments.VoteWitnessContractFragment;
import com.google.protobuf.InvalidProtocolBufferException;

import org.tron.protos.Contract;
import org.tron.protos.Protocol;

public class ContractLoaderFragment extends ContractFragment {

    private TextView mContractNameTextView;
    private FrameLayout mContract_FrameLayout;

    public ContractLoaderFragment() {
    }

    public static ContractLoaderFragment newInstance() {
        ContractLoaderFragment fragment = new ContractLoaderFragment();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_contract_loader, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        mContractNameTextView = view.findViewById(R.id.Contract_name_textView);
        mContract_FrameLayout = view.findViewById(R.id.Contract_frameLayout);
    }

    @Override
    public void setContract(@NonNull Protocol.Transaction.Contract contract) {
        mContractNameTextView.setText(getContractName(contract));
        loadContractFragment(contract);
        // TODO animate
    }

    public String getContractName(@NonNull Protocol.Transaction.Contract contract) {
        switch (contract.getType()) {
            case AccountCreateContract:
                return getString(R.string.account_create_contract);
            case TransferContract:
                return getString(R.string.transfer_contract);
            case TransferAssetContract:
                return getString(R.string.transfer_asset_contract);
            case VoteAssetContract:
                return getString(R.string.vote_asset_contract);
            case VoteWitnessContract:
                return getString(R.string.vote_witness_contract);
            case WitnessCreateContract:
                return getString(R.string.witness_create_contract);
            case AssetIssueContract:
                return getString(R.string.asset_issue_contract);
            case WitnessUpdateContract:
                return getString(R.string.witness_update_contract);
            case ParticipateAssetIssueContract:
                return getString(R.string.participate_asset_issue_contract);
            case AccountUpdateContract:
                return getString(R.string.account_update_contract);
            case FreezeBalanceContract:
                return getString(R.string.freeze_balance_contract);
            case UnfreezeBalanceContract:
                return getString(R.string.unfreeze_balance_contract);
            case WithdrawBalanceContract:
                return getString(R.string.withdraw_balance_contract);
            case UnfreezeAssetContract:
                return getString(R.string.unfreeze_asset_contract);
            case UpdateAssetContract:
                return getString(R.string.update_asset_contract);
            case CustomContract:
                return getString(R.string.custom_contract);
            case UNRECOGNIZED:
                return getString(R.string.unrecognized);
        }
        return "";
    }

    private void loadContractFragment(@NonNull Protocol.Transaction.Contract contract) {
        final FragmentTransaction transaction = getFragmentManager().beginTransaction();
        ContractFragment fragment = null;

        switch (contract.getType()) {
            case AccountCreateContract:
                break;
            case TransferContract:
                fragment = TransferContractFragment.newInstance();
                break;
            case TransferAssetContract:
                fragment = TransferAssetContractFragment.newInstance();
                break;
            case VoteAssetContract:
                break;
            case VoteWitnessContract:
                fragment = VoteWitnessContractFragment.newInstance();
                break;
            case WitnessCreateContract:
                break;
            case AssetIssueContract:
                fragment = AssetIssueContractFragment.newInstance();
                break;
            case WitnessUpdateContract:
                break;
            case ParticipateAssetIssueContract:
                fragment = ParticipateAssetIssueContractFragment.newInstance();
                break;
            case AccountUpdateContract:
                fragment = AccountUpdateContractFragment.newInstance();
                break;
            case FreezeBalanceContract:
                fragment = FreezeContractFragment.newInstance();
                break;
            case UnfreezeBalanceContract:
                break;
            case WithdrawBalanceContract:
                break;
            case UnfreezeAssetContract:
                break;
            case UpdateAssetContract:
                break;
            case CustomContract:
                break;
            case UNRECOGNIZED:
                break;
        }
        if(fragment != null) {
            fragment.setContract(contract);
            transaction.replace(R.id.Contract_frameLayout, fragment);
            transaction.disallowAddToBackStack();
            transaction.commit();
        }
    }
}