import { NextRequest, NextResponse } from 'next/server';
import { createClient } from '@/utils/supabase/server';
interface BillRequestData {
tableName?: string | null;
tableId?: string | null;
paymentMethod: 'cash' | 'card';
}
// Function to fetch currently working employees with their Discord IDs
async function fetchCurrentlyWorkingEmployees() {
const supabase = createClient();
const now = new Date().toISOString();
// First get the user_ids of employees currently working
const { data: scheduleData, error: scheduleError } = await supabase
.from('schedules')
.select('user_id')
.lte('start_time', now)
.gte('end_time', now);
if (scheduleError) {
console.error('Error fetching schedules:', scheduleError.message);
return [];
}
if (!scheduleData || scheduleData.length === 0) {
return [];
}
// Get discord_ids from profiles table for the working employees
const userIds = scheduleData
.map(schedule => schedule.user_id)
.filter(Boolean) as string[];
const { data: profilesData, error: profilesError } = await supabase
.from('profiles')
.select('discord_id')
.in('user_id', userIds)
.not('discord_id', 'is', null);
if (profilesError) {
console.error('Error fetching profiles:', profilesError.message);
return [];
}
// Return only the discord_ids (filtering out null values)
return profilesData
.map(profile => profile.discord_id)
.filter(Boolean);
}
export async function POST(req: NextRequest) {
try {
// We're using the same webhook as orders
const webhookUrl = process.env.DISCORD_ORDERS_WEBHOOK_URL;
// Handle the case where webhookUrl is not set
if (!webhookUrl) {
console.error('Discord orders webhook URL is not set in environment variables.');
return NextResponse.json(
{ message: 'Server error: Discord webhook URL is not configured.' },
{ status: 500 }
);
}
const data: BillRequestData = await req.json();
// Validate table information
const { tableName, tableId, paymentMethod } = data;
if (!tableName || !tableId) {
return NextResponse.json(
{ message: 'Bad request: Missing table information.' },
{ status: 400 }
);
}
// Get currently working employees to tag them
const workingEmployeeDiscordIds = await fetchCurrentlyWorkingEmployees();
// Create the employee tags if there are any
const employeeTags = workingEmployeeDiscordIds.length > 0
? workingEmployeeDiscordIds.map(id => `<@${id}>`).join(' ') + '\n\n'
: '';
// Format payment method for display
const paymentMethodDisplay = paymentMethod === 'cash' ? '💵 В БРОЙ' : '💳 КАРТА';
// Prepare the message content
const messageContent = [
employeeTags,
`### 🧾 **ИСКАНЕ ЗА СМЕТКА**`,
``,
`📍 **Маса:** ${tableName}`,
`💰 **Начин на плащане:** ${paymentMethodDisplay}`,
].filter(Boolean).join('\n');
// Send the message to Discord via the webhook
const discordResponse = await fetch(webhookUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
content: messageContent,
username: 'Bill Request Bot',
avatar_url: 'https://www.vkashti.bar/logo.png'
})
});
if (!discordResponse.ok) {
console.error(
'Failed to send message to Discord webhook:',
discordResponse.statusText
);
return NextResponse.json(
{ message: 'Error sending bill request to Discord.' },
{ status: 500 }
);
}
// Return success
return NextResponse.json({
message: 'Bill request submitted successfully'
}, { status: 200 });
} catch (error) {
console.error('Error:', error);
return NextResponse.json({ message: 'Server error.' }, { status: 500 });
}
}