import { useState, useEffect, useMemo } from 'react';
import {
    Avatar,
    Box,
    Card,
    Group,
    Progress,
    ScrollArea,
    Select,
    Stack,
    Table,
    Text,
    ThemeIcon,
    Tooltip,
    UnstyledButton,
} from '@mantine/core';
import { useSelector, useDispatch } from 'react-redux';
import {
    IconSelector,
    IconLayoutList,
    IconArrowUp,
    IconArrowDown,
    IconArrowsSort,
} from '@tabler/icons-react';
import { translate } from "../../utils/i18n";
import { fetchMembersTasksCounts } from "../Settings/store/taskSlice";

function LegendItem({ label, color, value }) {
    return (
        <Group gap="xs" style={{ flexWrap: "nowrap" }}>
            <Box
                w={12}
                h={12}
                style={{
                    backgroundColor: color,
                    borderRadius: "50%",
                    flexShrink: 0,
                }}
            />
            <Text size="sm" c="dimmed">
                {label}
            </Text>
            {value && (
                <Text size="sm" c="#202020">
                    : {value}
                </Text>
            )}
        </Group>
    )
}

const DashboardTaskProgress = ({ dragHandle }) => {

    const dispatch = useDispatch();
    const { membersTasksCounts } = useSelector((state) => state.settings.task);
    const { loggedUserId } = useSelector((state) => state.auth.user);
    const { loggedInUser, xWpNonce } = useSelector((state) => state.auth.session);

    const [selectedProject, setSelectedProject] = useState(null);
    const [projectInfo, setProjectInfo] = useState({});
    const [memberTasks, setMemberTasks] = useState([]);
    const [sortCol, setSortCol] = useState('name');
    const [sortDir, setSortDir] = useState('asc');

    const toggleSort = (col) => {
        if (sortCol === col) {
            setSortDir(sortDir === 'asc' ? 'desc' : 'asc');
        } else {
            setSortCol(col);
            setSortDir(col === 'name' ? 'asc' : 'desc');
        }
    };

    const SortHeader = ({ col, label, align = 'left' }) => {
        const active = sortCol === col;
        const Icon = !active ? IconArrowsSort : sortDir === 'asc' ? IconArrowUp : IconArrowDown;
        return (
            <UnstyledButton
                onClick={() => toggleSort(col)}
                style={{
                    display: 'flex',
                    alignItems: 'center',
                    justifyContent: align === 'right' ? 'flex-end' : 'flex-start',
                    gap: 4,
                    width: '100%',
                    fontSize: 11,
                    fontWeight: 700,
                    color: active ? '#39758D' : '#64748B',
                    textTransform: 'uppercase',
                    letterSpacing: '0.4px',
                }}
            >
                {label}
                <Icon size={12} stroke={1.8} style={{ opacity: active ? 1 : 0.5 }} />
            </UnstyledButton>
        );
    };

    const sortedMemberTasks = useMemo(() => {
        const dir = sortDir === 'asc' ? 1 : -1;
        return [...memberTasks].sort((a, b) => {
            if (sortCol === 'name') return (a.name || '').localeCompare(b.name || '') * dir;
            const aTotal = (a.active_tasks || 0) + (a.completed_tasks || 0) + (a.overdue_tasks || 0);
            const bTotal = (b.active_tasks || 0) + (b.completed_tasks || 0) + (b.overdue_tasks || 0);
            return (aTotal - bTotal) * dir;
        });
    }, [memberTasks, sortCol, sortDir]);

    const userId = loggedInUser?.loggedUserId ?? loggedUserId;
    const isAdmin = loggedInUser?.is_superadmin || loggedInUser?.llc_roles?.some(role => role.slug === 'admin');
    const isWpAdmin = loggedInUser?.roles?.includes('administrator');
    useEffect(() => {
        if (!xWpNonce) return;

        if (!membersTasksCounts || Object.keys(membersTasksCounts).length === 0) {
            dispatch(fetchMembersTasksCounts({ id: isAdmin || isWpAdmin ? null : userId }));
        }
    }, [
        dispatch,
        loggedInUser,
        xWpNonce
    ]);


    useEffect(() => {
        if (membersTasksCounts && membersTasksCounts.length > 0) {
            setSelectedProject(membersTasksCounts[0]?.id.toString());
            setProjectInfo(membersTasksCounts[0] || {});
            setMemberTasks(membersTasksCounts[0]?.members || []);
        }
    }, [membersTasksCounts]);

    useEffect(() => {
        if (selectedProject && membersTasksCounts && membersTasksCounts.length > 0) {
            const project = membersTasksCounts.find(p => p.id.toString() === selectedProject);
            setMemberTasks(project?.members || []);
            setProjectInfo(project || {});
        }
    }, [selectedProject, membersTasksCounts]);

    return (
        <Card padding="md" withBorder radius="md" h="100%"
            style={{ display: 'flex', flexDirection: 'column' }}
        >
            <Card.Section withBorder inheritPadding py="xs" className="bg-[#DBE5FF] mb-2">
                <Box className={dragHandle ? "draggable-header cursor-grab" : ""}>
                    <Group justify="space-between" align="center" wrap="nowrap">
                        <Group gap="xs" wrap="nowrap">
                            {dragHandle}
                            <ThemeIcon size="sm" radius="sm" variant="light" color="#3B5BDB">
                                <IconLayoutList size={14} />
                            </ThemeIcon>
                            <Text fw={600} size="sm">{translate('Task Distribution Matrix (By Project)')}</Text>
                        </Group>
                        <Box
                            onMouseDown={(e) => { if (dragHandle) e.stopPropagation(); }}
                            style={{ background: '#fff', borderRadius: 6, paddingLeft: 8 }}
                        >
                            <Select
                                size="xs"
                                variant="unstyled"
                                placeholder={translate('Select Project')}
                                data={
                                    (membersTasksCounts && membersTasksCounts.length > 0
                                    && membersTasksCounts.map((project) => ({
                                        value: project.id.toString(),
                                        label: project.name,
                                    }))) || []
                                }
                                value={selectedProject}
                                onChange={setSelectedProject}
                                allowDeselect={false}
                                rightSection={<IconSelector size={14} stroke={2} color="#64748B" />}
                                w={160}
                            />
                        </Box>
                    </Group>
                </Box>
            </Card.Section>
            <Box style={{ flex: 1, display: 'flex', flexDirection: 'column', minHeight: 0 }}>
                <ScrollArea h="100%" mih={240} scrollbarSize={4}>
                    <Table layout="fixed" withRowBorders={false} highlightOnHover>
                        <Table.Thead style={{ background: '#FAFBFC' }}>
                            <Table.Tr>
                                <Table.Th style={{ width: 220 }}>
                                    <SortHeader col="name" label={translate('Member')} />
                                </Table.Th>
                                <Table.Th style={{ width: '100%' }}>
                                    <span
                                        style={{
                                            display: 'block',
                                            fontSize: 11,
                                            fontWeight: 700,
                                            color: '#64748B',
                                            textTransform: 'uppercase',
                                            letterSpacing: '0.4px',
                                        }}
                                    >
                                        {translate('Workload')}
                                    </span>
                                </Table.Th>
                                <Table.Th style={{ width: 80, textAlign: 'right' }}>
                                    <SortHeader col="total" label={translate('Total')} align="right" />
                                </Table.Th>
                            </Table.Tr>
                        </Table.Thead>
                        <Table.Tbody>
                            {sortedMemberTasks.map((member) => {
                                const getVisiblePercent = (percent) => {
                                    if (percent === 0) return 0;
                                    if (percent > 0 && percent < 1) return 0;
                                    if (percent < 5) return 5;
                                    return percent;
                                };

                                const active = member.active_tasks || 0;
                                const completed = member.completed_tasks || 0;
                                const overdue = member.overdue_tasks || 0;
                                const memberTotal = active + completed + overdue;

                                const total = projectInfo.total_assigned_tasks || 0;

                                const activePercent = total > 0 ? (active / total) * 100 : 0;
                                const overduePercent = total > 0 ? (overdue / total) * 100 : 0;

                                const activeVisible = getVisiblePercent(activePercent);
                                const overdueVisible = getVisiblePercent(overduePercent);

                                return (
                                    <Table.Tr key={member.id}>
                                        <Table.Td>
                                            <Group gap="sm" wrap="nowrap">
                                                <Avatar variant="light" name={member.name} radius="xl" size="sm" color="orange" src={member.avatar} />
                                                <Text size="sm" c="dimmed" truncate maw={140}>{member.name}</Text>
                                            </Group>
                                        </Table.Td>
                                        <Table.Td>
                                            <Box style={{ minWidth: 200 }}>
                                                <Progress.Root striped animated size={20} transitionDuration={400}
                                                    styles={{
                                                        label: { color: 'white', fontWeight: 700, fontSize: 11 },
                                                    }}
                                                >
                                                    {active > 0 ? (
                                                        <Tooltip label={`${translate('In Progress')}: ${active}`}>
                                                            <Progress.Section value={activeVisible} color="#2D9CDB">
                                                                <Progress.Label>{activePercent.toFixed(0)}%</Progress.Label>
                                                            </Progress.Section>
                                                        </Tooltip>
                                                    ) : null}
                                                    {overdue > 0 ? (
                                                        <Tooltip label={`${translate('Overdue')}: ${overdue}`}>
                                                            <Progress.Section value={overdueVisible} color="#E62727">
                                                                <Progress.Label>{overduePercent.toFixed(0)}%</Progress.Label>
                                                            </Progress.Section>
                                                        </Tooltip>
                                                    ) : null}
                                                </Progress.Root>
                                            </Box>
                                        </Table.Td>
                                        <Table.Td style={{ textAlign: 'right', fontVariantNumeric: 'tabular-nums' }}>
                                            <Text size="sm" fw={600}>{memberTotal}</Text>
                                        </Table.Td>
                                    </Table.Tr>
                                );
                            })}
                        </Table.Tbody>
                    </Table>
                </ScrollArea>
            </Box>
            <Group justify="space-between" align="center" mt="auto" style={{ width: '100%', paddingTop: '14px' }}>
                <Stack gap={8}>
                    <Group gap={5}>
                        <Text size="sm" c="dimmed">{translate('Total Tasks')}: </Text>
                        <Text size="sm" c="#202020">{projectInfo && projectInfo.total_tasks}</Text>
                    </Group>
                    <Group gap={5}>
                        <Text size="sm" c="dimmed">{translate('Total Assigned Tasks')}: </Text>
                        <Text size="sm" c="#202020">{projectInfo && projectInfo.total_assigned_tasks}</Text>
                    </Group>
                </Stack>
                <Stack gap={8}>
                    <LegendItem label={translate('In Progress')} color="#2D9CDB" value={projectInfo && projectInfo.active_tasks} />
                    <LegendItem label={translate('Overdue')} color="#E62727" value={projectInfo && projectInfo.overdue_tasks} />
                </Stack>
            </Group>
        </Card>
    );
};

export default DashboardTaskProgress;
