-- SECURITY UPDATES
-- This script strengthens the RLS policies by enforcing 'admin' role checks
-- instead of just checking if the user is authenticated.

-- 1. PRODUCTS TABLE
-- Drop existing loose policies
DROP POLICY IF EXISTS "Authenticated users can insert products." ON products;
DROP POLICY IF EXISTS "Authenticated users can update products." ON products;
DROP POLICY IF EXISTS "Authenticated users can delete products." ON products;

-- Create strict admin policies
CREATE POLICY "Admins can insert products"
  ON products FOR INSERT
  WITH CHECK (
    exists (
      select 1 from profiles
      where profiles.id = auth.uid() and profiles.role = 'admin'
    )
  );

CREATE POLICY "Admins can update products"
  ON products FOR UPDATE
  USING (
    exists (
      select 1 from profiles
      where profiles.id = auth.uid() and profiles.role = 'admin'
    )
  );

CREATE POLICY "Admins can delete products"
  ON products FOR DELETE
  USING (
    exists (
      select 1 from profiles
      where profiles.id = auth.uid() and profiles.role = 'admin'
    )
  );


-- 2. CUSTOMERS TABLE
-- Drop existing loose policies (if they match the previous loose pattern)
DROP POLICY IF EXISTS "Admins can insert customers" ON customers;
DROP POLICY IF EXISTS "Admins can update customers" ON customers;
DROP POLICY IF EXISTS "Admins can delete customers" ON customers;

-- Re-create strict policies (just to be sure, ensuring the subquery check is present)
CREATE POLICY "Strict Admin Insert Customers"
  ON customers FOR INSERT
  WITH CHECK (
    exists (
      select 1 from profiles
      where profiles.id = auth.uid() and profiles.role = 'admin'
    )
  );

CREATE POLICY "Strict Admin Update Customers"
  ON customers FOR UPDATE
  USING (
    exists (
      select 1 from profiles
      where profiles.id = auth.uid() and profiles.role = 'admin'
    )
  );

CREATE POLICY "Strict Admin Delete Customers"
  ON customers FOR DELETE
  USING (
    exists (
      select 1 from profiles
      where profiles.id = auth.uid() and profiles.role = 'admin'
    )
  );

-- 3. SITE CONTENTS TABLE
DROP POLICY IF EXISTS "Admin update access" ON site_contents;
DROP POLICY IF EXISTS "Admin insert access" ON site_contents;

CREATE POLICY "Strict Admin Update Site Contents"
  ON site_contents FOR UPDATE
  USING (
    exists (
      select 1 from profiles
      where profiles.id = auth.uid() and profiles.role = 'admin'
    )
  );

CREATE POLICY "Strict Admin Insert Site Contents"
  ON site_contents FOR INSERT
  WITH CHECK (
    exists (
      select 1 from profiles
      where profiles.id = auth.uid() and profiles.role = 'admin'
    )
  );
