import { NextRequest, NextResponse } from "next/server";
import { addDays, format, getDay, isAfter, parseISO } from "date-fns";
import { isSupabaseConfigured } from "@/lib/supabase/server";
import { createAdminClient } from "@/lib/supabase/admin";
import { readBookings, overlaps } from "@/lib/local-bookings";
import { daySlots } from "@/lib/booking-hours";
import { services } from "@/lib/data";

const defaultHours: Record<number, [string,string] | null> = { 0:null, 1:null, 2:["10:00","18:00"], 3:["10:00","18:00"], 4:["11:00","19:00"], 5:["10:00","18:00"], 6:["09:00","15:00"] };
function slots(start:string,end:string){const out:string[]=[];let [h,m]=start.split(":").map(Number);const [eh,em]=end.split(":").map(Number);while(h*60+m<eh*60+em){out.push(`${String(h).padStart(2,"0")}:${String(m).padStart(2,"0")}`);m+=30;if(m>=60){h++;m-=60}}return out;}

export async function GET(req: NextRequest) {
  const dateParam = req.nextUrl.searchParams.get("date");
  if(!isSupabaseConfigured()) {
    const service=services.find(s=>s.id===req.nextUrl.searchParams.get("service"));
    const duration=service?.duration||60;
    const day=dateParam||format(addDays(new Date(),1),"yyyy-MM-dd");
    try { const rows=await readBookings(); return NextResponse.json({slots:daySlots(day,duration).filter(time=>!overlaps(rows,day,time,duration))},{headers:{"Cache-Control":"no-store"}}); }
    catch { return NextResponse.json({error:"Availability could not be loaded."},{status:503}); }
  }
  const date = dateParam ? parseISO(dateParam) : addDays(new Date(), 1);
  if (!isAfter(date, addDays(new Date(), -1)) || isAfter(date, addDays(new Date(), 90))) return NextResponse.json({ slots: [] });
  const hours = defaultHours[getDay(date)]; if (!hours) return NextResponse.json({ slots: [] });
  let available = slots(...hours);
  if (isSupabaseConfigured()) {
    const supabase = createAdminClient(); const day = format(date,"yyyy-MM-dd");
    const [{data:appointments},{data:blocks}] = await Promise.all([
      supabase.from("appointments").select("start_time,status").eq("appointment_date",day).neq("status","cancelled"),
      supabase.from("blocked_times").select("start_time,end_time").eq("block_date",day),
    ]);
    const busy = new Set((appointments||[]).map(a=>String(a.start_time).slice(0,5)));
    available = available.filter(time => !busy.has(time) && !(blocks||[]).some(b => time >= String(b.start_time).slice(0,5) && time < String(b.end_time).slice(0,5)));
  }
  return NextResponse.json({ slots: available });
}
