CREATE TABLE public.contact_submissions (
 id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
 created_at timestamptz NOT NULL DEFAULT now(),
 name text NOT NULL CHECK (char_length(name) BETWEEN 1 AND 100),
 email text NOT NULL CHECK (char_length(email) BETWEEN 3 AND 255),
 phone text NOT NULL DEFAULT '' CHECK (char_length(phone) <= 30),
 message text NOT NULL CHECK (char_length(message) BETWEEN 1 AND 3000),
 request_hash text NOT NULL
);
GRANT ALL ON public.contact_submissions TO service_role;
ALTER TABLE public.contact_submissions ENABLE ROW LEVEL SECURITY;
CREATE INDEX contact_submissions_rate_idx ON public.contact_submissions (request_hash, created_at);
CREATE FUNCTION public.submit_contact(p_name text, p_email text, p_phone text, p_message text, p_request_hash text)
RETURNS uuid LANGUAGE plpgsql SET search_path = public AS $$
DECLARE submission_id uuid;
BEGIN
 PERFORM pg_advisory_xact_lock(hashtextextended(p_request_hash, 0));
 IF (SELECT count(*) FROM public.contact_submissions WHERE request_hash = p_request_hash AND created_at > now() - interval '10 minutes') >= 5 THEN
  RAISE EXCEPTION 'contact_rate_limit';
 END IF;
 INSERT INTO public.contact_submissions(name,email,phone,message,request_hash) VALUES(p_name,p_email,p_phone,p_message,p_request_hash) RETURNING id INTO submission_id;
 RETURN submission_id;
END;
$$;
REVOKE ALL ON FUNCTION public.submit_contact(text,text,text,text,text) FROM PUBLIC, anon, authenticated;
GRANT EXECUTE ON FUNCTION public.submit_contact(text,text,text,text,text) TO service_role;