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
Carregando exceções...
) : excecoes.length === 0 ? (Nenhuma exceção encontrada para os filtros aplicados.
) : (| 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 || '—'} |
|