import { Head, setLayoutProps, usePage } from '@inertiajs/react';
import { useMemo } from 'react';

import { DivisionHeader } from '@/components/divisions/DivisionHeader';
import { TaskList } from '@/components/TaskList';
import { useTaskDeepLink } from '@/hooks/use-task-deep-link';
import {
    divisionRoleAsProjectRole,
    mapApiTasksToTaskoTasks,
} from '@/lib/task-mappers';
import { index as divisionsIndex, show_tasks } from '@/routes/divisions';

import type { Auth } from '@/types';
import type { DivisionShowTasksProps } from '@/types/division';
import type { Task as TaskoTask } from '@/types/task';

// Konteks project untuk mapper API → Task frontend. Task divisi tidak terikat
// project, jadi dipakai project semu (projectId kosong) yang konsisten dengan
// pemakaian sebelumnya di halaman ini.
const DIVISION_TASK_PROJECT = {
    id: '',
    groupId: '',
    projectName: 'Division Task',
    description: '',
    progressStatus: 'waiting' as const,
    creatorId: '',
    deadline: '',
    createdAt: '',
    updatedAt: '',
};

const DIVISION_MAP_CONTEXT = {
    assigneeSource: 'division' as const,
    dateFallback: 'api' as const,
    project: DIVISION_TASK_PROJECT,
    timestampSource: 'api' as const,
};

export default function DivisionsShowTasks({ data }: DivisionShowTasksProps) {
    const page = usePage<Auth>();
    const { auth } = page.props;
    const currentUserId = String(auth.user.id);

    // Deep-link `?task=<id>` dari klik notifikasi lonceng.
    const {
        taskId: taskIdFromUrl,
        fetchTaskById,
        clearTaskQuery,
    } = useTaskDeepLink(DIVISION_MAP_CONTEXT);

    const currentMemberRole = data.members.find(
        (m) => String(m.user_id) === currentUserId,
    )?.role_type;

    const canManageTasks =
        currentMemberRole === 'admin' || currentMemberRole === 'supervisor';

    const taskIndexUrl = show_tasks(data.base_info).url;

    // Map root task (subtask ter-nest otomatis oleh mapper) ke bentuk Task
    // frontend yang dibutuhkan TaskList.
    const adaptedTasks: TaskoTask[] = useMemo(
        () => mapApiTasksToTaskoTasks(data.tasks, DIVISION_MAP_CONTEXT),
        [data.tasks],
    );

    // Peran ikut dikirim supaya sheet task menyaring viewer dengan aturan yang
    // sama seperti konteks project.
    const divisionMembersForTaskSheet = useMemo(
        () =>
            data.members.map((m) => ({
                id: String(m.user_id),
                name: m.user_name,
                role: divisionRoleAsProjectRole(m.role_type),
            })),
        [data.members],
    );

    setLayoutProps({
        breadcrumbs: [
            {
                title: 'Divisions',
                href: divisionsIndex().url,
            },
            {
                title: data.base_info.name,
            },
            {
                title: 'Tasks',
            },
        ],
    });

    return (
        <>
            <Head title={`${data.base_info.name} - Tasks`} />

            <div className="flex min-h-full flex-col bg-muted/50">
                <DivisionHeader baseInfo={data.base_info} />

                <div className="mx-auto w-full p-4 md:p-8">
                    <TaskList
                        title="Division Tasks"
                        tasks={adaptedTasks}
                        pagination={data.pagination}
                        summary={data.task_summary}
                        projectUrl={taskIndexUrl}
                        can={{ manageTasks: canManageTasks }}
                        currentUserId={currentUserId}
                        reloadOnly={['data']}
                        filterParamNames={{
                            search: 'task_search',
                            status: 'task_status',
                            deadline: 'task_deadline',
                            mine: 'task_mine',
                            priority: 'task_priority',
                            sort: 'task_sort',
                        }}
                        showStartDateColumn
                        initialViewingTaskId={taskIdFromUrl}
                        fetchTaskById={fetchTaskById}
                        onSheetClose={clearTaskQuery}
                        taskSheetDivisionId={String(data.base_info.id)}
                        taskSheetMembers={divisionMembersForTaskSheet}
                        createTaskConfig={{
                            withoutProject: true,
                            divisionId: String(data.base_info.id),
                            divisionMembers: divisionMembersForTaskSheet,
                        }}
                    />
                </div>
            </div>
        </>
    );
}
