import { FontAwesome } from "@expo/vector-icons";
import { router, useLocalSearchParams } from "expo-router";
import { FlatList, SafeAreaView, StyleSheet, Text, TouchableOpacity, View } from "react-native";
import { ExpenseItem, LoadingSymbol, TextInputBar } from "../../../components";
import useFetch from "../../../hooks/useFetch";
import { useTheme } from "../../contexts/ThemeContext";

export default function Page() {
    const {colors} = useTheme();
    const {category_guid} = useLocalSearchParams();

    const {category_amount, category_color, category_name, category_type} = fetchCategoryInformation(category_guid.toString());

    const {data, isLoading, reFetch} = useFetch({sql: "SELECT e.guid AS expense_guid, e.name AS expense_name, c.name AS category_name, e.datetime AS expense_datetime, e.amount AS expense_amount, c.color AS category_color FROM expense e JOIN category c ON e.category_guid = c.guid WHERE c.guid = ? ORDER BY expense_datetime desc;", args: [category_guid]});

    const handleEditCategory = () => {
        router.push({pathname: "./(tabs)/budget/editCategory", params: {category_guid: category_guid, category_color: category_color, category_amount: category_amount, category_name: category_name, category_type: category_type}});
    }
    
    const handleBackButton = () => {
        router.back();
    }

    return (
        <SafeAreaView style={[styles.safeAreaView, {backgroundColor: colors.containerColor}]}>
            <TouchableOpacity style={styles.backContainer} onPress={handleBackButton}>
                <FontAwesome style={styles.iconBack} name="arrow-left" size={35} color={colors.primaryText}/>
                <Text style={[styles.backText, {color: colors.secondaryText}]}>Back</Text>
            </TouchableOpacity>

            <TouchableOpacity style={[styles.categoryEditTouchableOpacity, {backgroundColor: colors.elementDefaultColor}]}
            onPress={handleEditCategory}>
                <Text style={[styles.editButtonText, {color: colors.primaryText}]}>{category_name}</Text>
                <FontAwesome style={styles.iconEdit} name="edit" size={35} color={colors.primaryText}/>
            </TouchableOpacity>

            <TextInputBar style={styles.searchBar} placeholder="Search..."/>

            {isLoading ? (<LoadingSymbol/>) : (
                <FlatList 
                    data={data} 
                    renderItem = {({item}) => <ExpenseItem
                        color={item.category_color} 
                        category={item.category_name} 
                        title={item.expense_name} 
                        date={item.expense_datetime} 
                        value={item.expense_amount}
                    />}
                    keyExtractor={item => item.guid}
                    ItemSeparatorComponent={() => {
                        return (<View style={styles.itemSeperator}/>);
                    }}
                />
            )}
        </SafeAreaView>
    );
}

const fetchCategoryInformation = (guid: string) => {

    const {data} = useFetch({sql: "SELECT * FROM category WHERE guid = ?", args: [guid]});

    let category_name = "";
    let category_color = "";
    let category_amount = 0;
    let category_type = "";

    if (data && data[0]) {
        if ("name" in data[0]) category_name = data[0].name as string;
        if ("color" in data[0]) category_color = data[0].color as string;
        if ("allocated_amount" in data[0]) category_amount = data[0].allocated_amount as number;
        if ("type" in data[0]) category_type = data[0].type as string;
    }
    
    return {category_name, category_color, category_amount, category_type};
}

const styles = StyleSheet.create({
    safeAreaView: {
        flex: 1,
    },
    itemSeperator: {
        margin: 5,
    },
    categoryEditTouchableOpacity: {
        borderRadius: 10,
        flexDirection: "row",
        justifyContent: "space-around",
        margin: 10,
    },
    editButtonText: {
        fontSize: 30,
        padding: 10,
        fontWeight: "bold",
    },
    iconEdit: {
        paddingVertical: 10,
        paddingRight: 10,
    },
    searchBar: {
        marginHorizontal: 10,
        marginBottom:20,
    },
    iconBack: {
        paddingLeft: 10,
        paddingRight: 5,
    },
    backText: {
        fontSize: 20,
        padding: 5,
    },
    backContainer: {
        flexDirection: "row",
        justifyContent: "flex-start",
    }
});
