"use server";
import { revalidatePath } from "next/cache"; import { redirect } from "next/navigation"; import { createClient, isSupabaseConfigured } from "@/lib/supabase/server";
import { clearLocalAdminSession, createLocalAdminSession, isLocalAdmin, verifyLocalAdmin } from "@/lib/admin-auth"; import { createAdminClient } from "@/lib/supabase/admin";
async function admin(){if(await isLocalAdmin()){if(!isSupabaseConfigured())throw new Error("Connect Supabase before editing live data");return createAdminClient();}if(!isSupabaseConfigured())throw new Error("Supabase is not configured");const s=await createClient();const {data:{user}}=await s.auth.getUser();if(!user)redirect("/admin/login");const {data}=await s.from("admin_users").select("user_id").eq("user_id",user.id).maybeSingle();if(!data)throw new Error("Administrator access required");return s;}
export async function login(form:FormData){const username=String(form.get("username")||"");const password=String(form.get("password")||"");if(verifyLocalAdmin(username,password)){await createLocalAdminSession();redirect("/admin/local");}if(isSupabaseConfigured()&&username.includes("@")){const s=await createClient();const {error}=await s.auth.signInWithPassword({email:username,password});if(!error)redirect("/admin");}redirect("/admin/login?error=invalid");}
export async function logout(){await clearLocalAdminSession();if(isSupabaseConfigured()){const s=await createClient();await s.auth.signOut();}redirect("/admin/login");}
export async function setAppointmentStatus(form:FormData){const s=await admin();const id=String(form.get("id"));const status=String(form.get("status"));if(!["requested","confirmed","completed","cancelled","no_show"].includes(status))throw new Error("Invalid status");await s.from("appointments").update({status}).eq("id",id);revalidatePath("/admin");}
export async function addBlockedTime(form:FormData){const s=await admin();await s.from("blocked_times").insert({block_date:String(form.get("date")),start_time:String(form.get("start")),end_time:String(form.get("end")),reason:String(form.get("reason")||"Unavailable")});revalidatePath("/admin");}
export async function saveSetting(form:FormData){const s=await admin();const key=String(form.get("key"));const allowed=["booking_mode","studio_email","instagram","home_announcement","seo_description"];if(!allowed.includes(key))throw new Error("Invalid setting");await s.from("site_settings").upsert({key,value:String(form.get("value")||"")},{onConflict:"key"});revalidatePath("/admin");}
export async function addService(form:FormData){const s=await admin();await s.from("services").insert({name:String(form.get("name")),slug:String(form.get("name")).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,""),category:String(form.get("category")),description:String(form.get("description")),price_cents:Math.round(Number(form.get("price"))*100),duration_minutes:Number(form.get("duration")),active:true});revalidatePath("/admin");}
export async function deleteService(form:FormData){const s=await admin();await s.from("services").update({active:false}).eq("id",String(form.get("id")));revalidatePath("/admin");}
export async function uploadGalleryImage(form:FormData){const s=await admin();const file=form.get("image");if(!(file instanceof File)||file.size===0||file.size>8_000_000||!file.type.startsWith("image/"))throw new Error("Choose an image under 8 MB");const ext=file.name.split(".").pop()?.replace(/[^a-z0-9]/gi,"")||"jpg";const path=`gallery/${crypto.randomUUID()}.${ext}`;const {error}=await s.storage.from("gallery").upload(path,file,{contentType:file.type});if(error)throw error;const {data}=s.storage.from("gallery").getPublicUrl(path);await s.from("gallery_items").insert({storage_path:path,image_url:data.publicUrl,alt_text:String(form.get("alt")),category:String(form.get("category")||"Recent"),published:true});revalidatePath("/admin");revalidatePath("/gallery");}
export async function removeGalleryImage(form:FormData){const s=await admin();const id=String(form.get("id"));const {data}=await s.from("gallery_items").select("storage_path").eq("id",id).single();if(data?.storage_path)await s.storage.from("gallery").remove([data.storage_path]);await s.from("gallery_items").delete().eq("id",id);revalidatePath("/admin");revalidatePath("/gallery");}
