import { findNodeHandle, UIManager } from 'react-native';
import React from 'react';
import { BannerModuleView } from './BannerViewManager';
import type { BannerViewProperties } from './ViewProperties';
import type { BluestackPreference } from '../Preference';
import logger from '../Utils/Logger';

export class BannerView extends React.Component<
    BannerViewProperties,
    { visible: boolean }
> {
    private _preferenceJSON = '{}';
    private _shouldAutoLoadWhenReady = false;

    constructor(props: BannerViewProperties) {
        super(props);

        this.state = {
            visible: true,
        };

        if (this.props.shouldLoadWhenReady != null) {
            this._shouldAutoLoadWhenReady = this.props.shouldLoadWhenReady;
        }

        if (this.props.preference != null && this._preferenceJSON === '{}') {
            this._preferenceJSON = this.props.preference.getPreferenceJSON();
        } else {
            this._preferenceJSON = '{}';
        }
    }

    public load(bsPreference?: BluestackPreference): void {
        if (this._shouldAutoLoadWhenReady) {
            logger.log(
                'Banner load call is not required when shouldLoadWhenReady is true'
            );
        }

        if (bsPreference != null) {
            this._preferenceJSON = bsPreference.getPreferenceJSON();
        } else {
            this._preferenceJSON = '{}';
        }

        this.loadWithPreferenceJSON(this._preferenceJSON);
    }

    private loadWithPreferenceJSON(preferenceJSON: string): void {
        logger.log('Loading Banner ad with preference: ' + preferenceJSON);
        UIManager.dispatchViewManagerCommand(
            findNodeHandle(this),
            'create' as any,
            [preferenceJSON]
        );
    }

    public destroy(): void {
        UIManager.dispatchViewManagerCommand(
            findNodeHandle(this),
            'destroy' as any,
            []
        );
    }

    public toggleRefresh(state: boolean = false): void {
        UIManager.dispatchViewManagerCommand(
            findNodeHandle(this),
            'refresh' as any,
            [state]
        );
    }

    public hide(): void {
        this.setState({
            visible: false,
        });
    }

    public show(): void {
        this.setState({
            visible: true,
        });
    }

    // private handleBannerAdLoadCalled(): void {
    //     logger.log('handleBannerAdLoadCalled: onBannerAdLoadCalled');
    //     //reset shouldLoadNow for next call
    //     this.setState({ shouldLoadNow: false });
    // }

    public render(): React.ReactNode {
        return (
            <BannerModuleView
                shouldLoadWhenReady={this._shouldAutoLoadWhenReady}
                visible={this.state.visible}
                type={this.props.type}
                placementId={this.props.placementId}
                preference={this._preferenceJSON}
                onBannerAdLoaded={this.props.onAdLoaded}
                onBannerAdFailedToLoad={this.props.onAdFailedToLoad}
                onBannerAdRefreshed={this.props.onAdRefreshed}
                onBannerAdFailedToRefresh={this.props.onAdFailedToRefresh}
                onBannerAdClicked={this.props.onAdClicked}
            />
        );
    }
}
