import { createServerFn } from "@tanstack/react-start";
import { z } from "zod";
import { requireSupabaseAuth } from "@/integrations/supabase/auth-middleware";

const Input = z.object({
  companyId: z.string().uuid(),
  status: z.enum(["pending", "approved", "suspended"]),
});

const MESSAGE: Record<string, { title: string; body: string }> = {
  approved: {
    title: "Service provider approved",
    body: "Your company was approved. You can now sign in to the Service Provider Portal.",
  },
  rejected: {
    title: "Service provider application rejected",
    body: "Your application was rejected. Contact Emma Exclusive Teams for details.",
  },
  suspended: {
    title: "Service provider suspended",
    body: "Your company has been suspended. Portal access is paused.",
  },
  pending: {
    title: "Service provider under review",
    body: "Your application is pending admin approval.",
  },
};

/** Emma Exclusive Teams admins change a company's marketplace status. */
export const setCompanyStatus = createServerFn({ method: "POST" })
  .middleware([requireSupabaseAuth])
  .inputValidator((input: unknown) => Input.parse(input))
  .handler(async ({ data, context }) => {
    const { data: isAdmin, error: roleError } = await context.supabase.rpc("has_role", {
      _user_id: context.userId,
      _role: "admin",
    });
    if (roleError) throw new Error(roleError.message);
    if (!isAdmin) throw new Error("Only Emma Exclusive Teams admins can change a company status.");

    const { supabaseAdmin } = await import("@/integrations/supabase/client.server");
    const { data: company, error } = await supabaseAdmin
      .from("companies")
      .update({ status: data.status, updated_at: new Date().toISOString() })
      .eq("id", data.companyId)
      .select("id,name,owner_id,status")
      .maybeSingle();
    if (error) throw new Error(error.message);
    if (!company) throw new Error("That company no longer exists.");

    const note = MESSAGE[data.status];
    await supabaseAdmin.from("notifications").insert({
      user_id: company.owner_id,
      title: note.title,
      body: note.body,
    });
    await supabaseAdmin.from("audit_logs").insert({
      actor_id: context.userId,
      action: `Company ${data.status}`,
      entity: company.name,
      entity_id: company.id,
    });

    return { id: company.id, status: company.status };
  });
