import { useEffect, useState } from 'react';

import { Status, StatusColors } from 'adapters/common';
import { getProjectTasks, Project } from 'adapters/project';
import { Task } from 'adapters/task';

import Filter from 'components/helpers/Filter';
import TaskList from 'components/layout/TaskList';
import LoadingScreen from 'components/ui/LoadingScreen';

import './project-tasks.scss';

interface Props {
    project: Project
}

/**
 * This is a tab of the project details page. It contains the list of all tasks that belong to the
 * project and filtering options for the tasks.
 */
export default function ProjectTasks({ project }: Props) {
    const [filter, setFilter] = useState({ term: '', tags: Object.values(Status) });
    const [allTasks, setAllTasks] = useState<Task[]>([]);
    const [shownTasks, setShownTasks] = useState<Task[]>();

    useEffect(() => {
        getProjectTasks(project.id).then(setAllTasks);
    }, [project]);

    useEffect(() => {
        setShownTasks(allTasks.filter(task => (
            task.name.toLowerCase().includes(filter.term.toLowerCase())
            && filter.tags.includes(task.status)
        )));
    }, [filter, allTasks])

    return (
        <div className="project-tasks">
            <Filter
                setFilter={setFilter}
                tags={
                    Object.values(Status).map(status => ({
                        label: status,
                        color: StatusColors.get(status.toString()),
                    }))
                }
                filter={filter}
            />
            {
                shownTasks
                    ? <TaskList tasks={shownTasks} addButton />
                    : <LoadingScreen />
            }
        </div>
    )
}