'use client';

import { message } from '@/lib/feedback/message';

/**
 * @fileoverview ObjetivoSprint - Componente para exibir e editar o objetivo da sprint
 */

import React, { useState } from 'react';

import { Check, Pencil, X } from 'lucide-react';
import {
    Button,
    Card,
    Input,
    Space,
    Typography,
} from 'antd';

import { ICON_SIZE_MD } from '@/components/icons';
import { useMutationCache } from '@/hooks/useMutationCache';
import { API_ENDPOINTS } from '@/lib/api/endpoints';
import { Sprint } from '@/types/projeto';

const { TextArea } = Input;
const { Title, Text } = Typography;

interface ObjetivoSprintProps {
    sprint: Sprint;
    onUpdate?: () => void;
}

/**
 * Componente ObjetivoSprint
 * 
 * Exibe e permite editar o objetivo da sprint (Sprint Goal)
 */
export default function ObjetivoSprint({ sprint, onUpdate }: ObjetivoSprintProps) {
    const [editing, setEditing] = useState(false);
    const [objetivo, setObjetivo] = useState(sprint.objetivo_sprint || sprint.objetivo || '');

    const updateMutation = useMutationCache<Sprint, { objetivo_sprint: string }>({
        endpoint: API_ENDPOINTS.desenvolvimento.sprints.definirObjetivo(sprint.id),
        method: 'PUT',
        invalidateQueries: [['sprint', sprint.id]],
        onSuccess: () => {
            message.success('Objetivo da sprint atualizado com sucesso!');
            setEditing(false);
            onUpdate?.();
        },
        onError: (error: unknown) => {
            const errorMessage =
                (error as { response?: { data?: { message?: string } } })?.response?.data
                    ?.message || 'Erro ao atualizar objetivo';
            message.error(errorMessage);
        },
    });

    const handleSave = () => {
        updateMutation.mutate({ objetivo_sprint: objetivo });
    };

    const handleCancel = () => {
        setObjetivo(sprint.objetivo_sprint || sprint.objetivo || '');
        setEditing(false);
    };

    if (editing) {
        return (
            <Card>
                <Space direction="vertical" style={{ width: '100%' }}>
                    <Title level={5}>Objetivo da Sprint</Title>
                    <TextArea
                        value={objetivo}
                        onChange={(e) => setObjetivo(e.target.value)}
                        rows={3}
                        placeholder="Defina o objetivo desta sprint..."
                        autoFocus
                    />
                    <Space>
                        <Button
                            type="primary"
                            icon={<Check />}
                            onClick={handleSave}
                            loading={updateMutation.isPending}
                        >
                            Salvar
                        </Button>
                        <Button icon={<X />} onClick={handleCancel}>
                            Cancelar
                        </Button>
                    </Space>
                </Space>
            </Card>
        );
    }

    return (
        <Card
            extra={
                <Button
                    type="link"
                    icon={<Pencil />}
                    onClick={() => setEditing(true)}
                >
                    Editar
                </Button>
            }
        >
            <Title level={5}>Objetivo da Sprint</Title>
            {objetivo ? (
                <Text>{objetivo}</Text>
            ) : (
                <Text type="secondary" italic>
                    Nenhum objetivo definido. Clique em &quot;Editar&quot; para definir.
                </Text>
            )}
        </Card>
    );
}

