import { StatusBar } from 'expo-status-bar';
import React, { useState, useEffect } from 'react';
import { View, ActivityIndicator, StyleSheet, SafeAreaView, FlatList } from 'react-native';
import { Button, IconButton } from 'react-native-paper';
import API from './../API.js';
import Post from './../components/Post.js';
import NewPost from "./../components/NewPost.js";
import ProfileHeader from '../components/ProfileHeader.js';
import AsyncStorage from '@react-native-async-storage/async-storage';

const storeProfilePosts = async (profileid, value) => {
    try {
        const jsonValue = JSON.stringify(value)
        await AsyncStorage.setItem('profile_' + profileid, jsonValue)
    } catch (e) {
    }
}

const getProfilePosts = async (profileid) => {
    try {
        const value = await AsyncStorage.getItem('profile_' + profileid)
        if (value !== null) {
            return JSON.parse(value);
        }
        return [];
    } catch (e) {
        console.log('fail getProfilePosts', e)
        return [];
    }
}

let Profile = ({ navigation, route }) => {
    let [Posts, setPosts] = useState([]);
    let [profile, setProfile] = useState({});
    const [showNewPost, setShowNewPost] = useState(false);
    const [tag, setTag] = useState('');
    const [loading, setLoading] = useState(true);

    useEffect(() => {
        let subscribed = true;
        const getData = async () => {
            setPosts([]);
            if (route.params && route.params.profileid && tag == '') {
                console.log('Loading Cache Profile:' + route.params.profileid);
                await API.getUserProfile(route.params.profileid).then((profileObj) => {
                    if(!subscribed) return 0;
                    let profile = profileObj.profile
                    setProfile(profileObj);
                    navigation.setOptions({ title: profile.firstName + " " + profile.lastName });
                });
                await getProfilePosts(route.params.profileid).then(setPosts);
                console.log('Loaded Cache Profile:' + route.params.profileid);
                API.getPosts(route.params.profileid).then((data) => {
                    setLoading(false);
                    if(!subscribed) return 0;
                    setPosts(data);
                    storeProfilePosts(route.params.profileid, data);
                    console.log('Store Cache Profile:' + route.params.profileid);
                });
            } else {
                if(route.params && route.params.profileid){
                    console.log('Getting posts with tag', tag)
                    API.getPostsWithTag(route.params.profileid, tag).then((data) => {
                        if(!subscribed) return 0;
                        setPosts(data.posts);
                    });
                } else {
                    // if no profile information is pressent should load feed
                    navigation.navigate('Feed')
                }
            }
        }
        getData();
        return ()=>{
            subscribed = false;
        }
    }, [tag, route.params?.profileid]);

    const getTagPosts = ()=>{
        API.getPostsWithTag(tag).then((data) => {
            //if(!subscribed) return 0;
            console.log(data.posts);
            setPosts(data.posts);
        });
    }

    const renderPost = (({ item }) => {
        if (item.nonOrganicType)
            return (<></>);
        return (<Post post={item} />);
    });
    const header = (
        <View>
            <ProfileHeader profileObj={profile} key={profile._id} />
            <View style={{
                flexDirection: "row", 
                alignItems:"center", 
                justifyContent: "space-evenly",
                paddingTop: 10
            }}>
                <View style={{
                            height: 40,
                            width: 40,
                            top: 0,
                            borderRadius: 28,
                            backgroundColor: "#c44d56",
                            justifyContent: 'center',
                            alignItems: 'center',
                            elevation: 10,
                            zIndex: 1,
                           }}>
                    <IconButton icon={showNewPost ? 'remove' : "add"} mode="outlined" color="white" onPress={()=>{
                        //setShowNewPost(!showNewPost);
                        navigation.navigate('NewPost', {toProfile: profile._id})
                    }} />
                </View>
                <Button style={{paddingLeft:12, backgroundColor:"#fff"}} title="Images" icon={tag == 'images' ? 'remove' : "image"} mode="outlined" onPress={()=>{
                    if(tag == 'images') return setTag('');
                    setTag('images');
                }}>{tag == 'images' ? "Images" : ''}</Button>
                <Button style={{paddingLeft:12, backgroundColor:"#fff"}} title="Media" icon={tag == 'media' ? 'remove' : "subscriptions"} mode="outlined" onPress={()=>{
                    if(tag == 'media') return setTag('');
                    setTag('media');
                }}>{tag == 'media' ? "Media" : ''}</Button>
                <Button style={{paddingLeft:12, backgroundColor:"#fff"}} title="Embedded" icon={tag == 'embedded' ? 'remove' : "folder"} mode="outlined" onPress={()=>{
                    if(tag == 'embedded') return setTag('');
                    setTag('embedded');
                }}>{tag == 'embedded' ? "Files" : ''}</Button>
            </View>
            { showNewPost ? 
                <NewPost newPostCB={(newPost) => setPosts([newPost, ...Posts])} />
                : <></>
            }
        </View>
    )

    return (
        <SafeAreaView style={styles.container}>
            <View>
                {(Posts.length !== 0 || profile._id) ?
                    <FlatList
                        data={Posts}
                        renderItem={renderPost}
                        keyExtractor={item => item.lastUpdated || item._id  || item.ceatedAt}
                        ListHeaderComponent={header}
                        refreshing={loading}
                        initialNumToRender={3}
                        maxToRenderPerBatch={3}
                        removeClippedSubviews={true}
                        onRefresh={() => {
                            API.getPosts(route.params.profileid).then(setPosts);
                        }}
                    /> :
                    <></> //TODO: Add empty profile card here
                }
            </View>
            <StatusBar style="auto" />
        </SafeAreaView>
    );
}

export default Profile;

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: "#edf2f7",
    },
});
