import React, { useState, useEffect, useCallback, useMemo } from 'react'; import dayjs from 'dayjs'; import 'dayjs/locale/pt-br'; import weekday from 'dayjs/plugin/weekday'; import FormCriarExcecao from '../components/FormCriarExcecao'; import "../components/AgendarConsulta/style/formagendamentos.css"; import "./style/Agendamento.css"; import './style/FilaEspera.css'; import { useAuth } from '../components/utils/AuthProvider'; import API_KEY from '../components/utils/apiKeys'; dayjs.extend(weekday); dayjs.locale('pt-br'); const ENDPOINT_BASE = "https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/doctor_exceptions"; const getDateRange = (date, view) => { const startDayjs = dayjs(date); let fromDate, toDate, titleRange; if (view === 'diario') { fromDate = startDayjs.format('YYYY-MM-DD'); toDate = startDayjs.format('YYYY-MM-DD'); titleRange = startDayjs.format('DD/MM/YYYY'); } else if (view === 'semanal') { // Padrão Dayjs: Sunday=0, Monday=1. // startOf('week') pode ser Domingo ou Segunda, dependendo do locale. // Se precisar forçar a Segunda-feira: let weekStart = startDayjs.startOf('week'); if (weekStart.day() !== 1) { // Se não for segunda-feira (1), ajusta weekStart = startDayjs.weekday(1); // Vai para a segunda-feira desta semana } const weekEnd = weekStart.add(6, 'day'); fromDate = weekStart.format('YYYY-MM-DD'); toDate = weekEnd.format('YYYY-MM-DD'); titleRange = `Semana de ${weekStart.format('DD/MM')} a ${weekEnd.format('DD/MM')}`; } else if (view === 'mensal') { const monthStart = startDayjs.startOf('month'); const monthEnd = startDayjs.endOf('month'); fromDate = monthStart.format('YYYY-MM-DD'); toDate = monthEnd.format('YYYY-MM-DD'); titleRange = startDayjs.format('MMMM/YYYY').toUpperCase(); } return { fromDate, toDate, titleRange }; }; const ExcecoesDisponibilidade = () => { const { getAuthorizationHeader } = useAuth(); const [pageNovaExcecao, setPageNovaExcecao] = useState(false); const [excecoes, setExcecoes] = useState([]); const [loading, setLoading] = useState(false); const [filtroMedicoId, setFiltroMedicoId] = useState(''); const [filtroData, setFiltroData] = useState(dayjs().format('YYYY-MM-DD')); const [visualizacao, setVisualizacao] = useState('diario'); const resolveAuthHeader = () => { try { const h = getAuthorizationHeader(); return h || ''; } catch { return ''; } } const fetchExcecoes = useCallback(async (fromDate, toDate, doctorId) => { setLoading(true); let url = `${ENDPOINT_BASE}?select=*`; if (doctorId) { url += `&doctor_id=eq.${doctorId}`; } url += `&date=gte.${fromDate}&date=lte.${toDate}`; const myHeaders = new Headers(); const authHeader = resolveAuthHeader(); if (authHeader) myHeaders.append("Authorization", authHeader); myHeaders.append("Content-Type", "application/json"); if (API_KEY) myHeaders.append("apikey", API_KEY); try { const requestOptions = { method: 'GET', headers: myHeaders, redirect: 'follow' }; const response = await fetch(url, requestOptions); const result = await response.json(); if (response.ok && Array.isArray(result)) { setExcecoes(result); } else { setExcecoes([]); console.error("Erro ao listar exceções (Status:", response.status, "):", result); alert(`Erro ao carregar lista de exceções. Status: ${response.status}. Detalhes: ${result.message || JSON.stringify(result)}`); } } catch (error) { console.error('Erro na requisição de listagem de exceções:', error); setExcecoes([]); alert("Erro de comunicação com o servidor ao listar exceções."); } finally { setLoading(false); } }, [getAuthorizationHeader]); const { fromDate, toDate, titleRange } = useMemo(() => getDateRange(filtroData, visualizacao), [filtroData, visualizacao] ); useEffect(() => { fetchExcecoes(fromDate, toDate, filtroMedicoId); }, [fetchExcecoes, filtroMedicoId, fromDate, toDate]); const deleteExcecao = async (id) => { if (!window.confirm("Confirma exclusão desta exceção?")) return; const myHeaders = new Headers(); const authHeader = resolveAuthHeader(); if (authHeader) myHeaders.append("Authorization", authHeader); if (API_KEY) myHeaders.append("apikey", API_KEY); myHeaders.append("Content-Type", "application/json"); try { const res = await fetch(`${ENDPOINT_BASE}?id=eq.${id}`, { method: 'DELETE', headers: myHeaders, redirect: 'follow' }); if (res.ok) { setExcecoes(prev => prev.filter(x => x.id !== id)); } else { const text = await res.text(); console.error('Erro ao deletar exceção', res.status, text); alert(`Erro ao excluir exceção. Status: ${res.status}. ${text}`); } } catch (err) { console.error('Erro na requisição de exclusão:', err); alert('Erro ao excluir exceção.'); } } const handleCancelForm = (recarregar = false) => { setPageNovaExcecao(false); if (recarregar) { fetchExcecoes(fromDate, toDate, filtroMedicoId); } } if (pageNovaExcecao) { return ; } return (
{/* Título e Botão de Criação */}

Gerenciar Exceções de Disponibilidade

{/* Filtros de Médico e Data */}
setFiltroMedicoId(e.target.value)} />
setFiltroData(e.target.value)} />
{/* Botões de Visualização (Dia/Semana/Mês) */}
{/* Tabela de Exceções (Título usa o titleRange calculado) */}

Exceções em {titleRange} ({excecoes.length})

{loading ? (

Carregando exceções...

) : excecoes.length === 0 ? (

Nenhuma exceção encontrada para os filtros aplicados.

) : ( {excecoes.map((exc) => ( ))}
Médico (ID) Data Início Término Motivo Criado por Ações

{exc.doctor_id}

{dayjs(exc.date).format('DD/MM/YYYY')} {exc.start_time ? dayjs(exc.start_time, 'HH:mm:ss').format('HH:mm') : '—'} {exc.end_time ? dayjs(exc.end_time, 'HH:mm:ss').format('HH:mm') : '—'}

{exc.reason}

{exc.created_by || '—'}
)}
); } export default ExcecoesDisponibilidade;