'use client';

import { Eye, Pencil, Pin, PinOff, Trash2 } from 'lucide-react';
import { ICON_SIZE_MD } from '@/components/icons';
import React from 'react';
import { ModalOpcoesBase, type ModalOpcaoAction } from '@/components/ModalOpcoesBase';
import type { Sprint } from '@/types';
import { getSprintStatusLabel } from '../sprint-status';

export interface ModalOpcoesSprintProps {
    open: boolean;
    onClose: () => void;
    item: Sprint | null;
    onVer: (item: Sprint) => void;
    onEditar?: (item: Sprint) => void;
    onExcluir?: (item: Sprint) => void;
    /** TASK-PWP-063 — fixar / desafixar "Minha sprint" (localStorage). */
    onTogglePin?: (item: Sprint) => void;
    /** True quando esta sprint já é a pin do projecto. */
    isPinned?: boolean;
}

export function ModalOpcoesSprint({
    open,
    onClose,
    item,
    onVer,
    onEditar,
    onExcluir,
    onTogglePin,
    isPinned = false,
}: ModalOpcoesSprintProps) {
    if (!item) return null;
    const subtitle = [item.nome, item.projeto?.nome, getSprintStatusLabel(item.status)]
        .filter((part) => part && part !== '—')
        .join(' · ');
    const actions: ModalOpcaoAction[] = [
        {
            key: 'ver',
            label: 'Ver detalhes',
            icon: <Eye size={ICON_SIZE_MD} aria-hidden />,
            onClick: () => {
                onClose();
                onVer(item);
            },
            primary: true},
    ];
    if (onTogglePin) {
        actions.push({
            key: 'pin',
            label: isPinned ? 'Desafixar Minha sprint' : 'Fixar como Minha sprint',
            icon: isPinned ? (
                <PinOff size={ICON_SIZE_MD} aria-hidden />
            ) : (
                <Pin size={ICON_SIZE_MD} aria-hidden />
            ),
            onClick: () => {
                onClose();
                onTogglePin(item);
            },
        });
    }
    if (onEditar) {
        actions.push({
            key: 'editar',
            label: 'Editar',
            icon: <Pencil size={ICON_SIZE_MD} aria-hidden />,
            onClick: () => {
                onClose();
                onEditar(item);
            }});
    }
    if (onExcluir) {
        actions.push({
            key: 'excluir',
            label: 'Excluir',
            icon: <Trash2 size={ICON_SIZE_MD} aria-hidden />,
            onClick: () => {
                onClose();
                onExcluir(item);
            },
            danger: true});
    }
    return (
        <ModalOpcoesBase
            open={open}
            onClose={onClose}
            title="Opções da sprint"
            subtitle={subtitle}
            actions={actions}
            width={380}
            data-testid="projeto-sprint-opcoes-modal"
            aria-label="Opções da sprint"
        />
    );
}
