import React from 'react';
import {
    StyleSheet,
    View,
    Animated,
    ViewProps,
    Text,
    RotateXTransform,
    RotateYTransform,
    PerpectiveTransform,
    RotateTransform,
    RotateZTransform,
    ScaleTransform,
    ScaleXTransform,

    ScaleYTransform,
    TranslateXTransform,
    TranslateYTransform,
    SkewXTransform,
    SkewYTransform,
    Easing,
} from 'react-native';
import { withAnchorPoint, Point, Size } from 'react-native-anchor-point';


interface IProps extends ViewProps {
    rotateOnXAxis?: boolean; 
    rotateOnYAxis?: boolean; 
    rotateOnZAxis?: boolean;
    anchorPoint: Point;
}

const CARD_WIDTH = 60;
const CARD_HEIGHT = 60;

export default class TestAnimatedCard extends React.Component<IProps> {
    _rotateAnimatedValue = new Animated.Value(0);
    _animation: any

    componentDidMount() {
       this._animation = Animated
           .loop(
               Animated.timing(this._rotateAnimatedValue, {
                   toValue: 1,
                   duration: 1500,
                   useNativeDriver: true,
                   easing: Easing.cubic
               }),
               { iterations: 1000 },
           )
           .start();
    }

    componentWillUnmount() {
      if(this._animation) {
        this._animation.stop(); 
        this._animation = null
      }
    }

    getTransform = () => {
        // why perspective: 400 useless when put it at last
        let transformValues= [{ perspective: 400 }];
        const rotateValue = this._rotateAnimatedValue.interpolate({
          inputRange: [0, 1], 
          outputRange: ['0deg', '360deg'],
        })

        const {rotateOnXAxis, rotateOnYAxis, rotateOnZAxis} = this.props;
        if (rotateOnXAxis) {
            transformValues.push({ rotateX: rotateValue });
        }

        if (rotateOnYAxis) {
            transformValues.push({ rotateY: rotateValue });
        }

        if (rotateOnZAxis) {
            transformValues.push({ rotateZ: rotateValue });
        }

        let transform = {
            transform: transformValues,
        };
        return withAnchorPoint(transform, this.props.anchorPoint, { width: CARD_WIDTH, height: CARD_HEIGHT });
    };

    render() {
        const { anchorPoint } = this.props;
        const top = anchorPoint.y * CARD_HEIGHT;
        const left = anchorPoint.x * CARD_WIDTH;

        return (
            <View style={styles.background}>
                <Animated.View style={[styles.blockBlue, this.getTransform()]} />
                <View style={[styles.anchorPoint, { left, top }]} />
                <Text style={[styles.text]}>
                    x: {anchorPoint.x}, y: {anchorPoint.y}
                </Text>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    background: {
        margin: 10,
        width: CARD_WIDTH,
        height: CARD_HEIGHT,
        backgroundColor: '#a6abaa',
    },
    anchorPoint: {
        width: 8,
        height: 8,
        backgroundColor: '#cc3b92',
        position: 'absolute',
    },
    blockBlue: {
        flex: 1,
        backgroundColor: '#03fcd3',
    },
    text: {
        position: 'absolute',
        top: CARD_HEIGHT/2,
        color: '#bd488b',
        fontSize: 11
    },
});