
CREATE TABLE public.partners (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id uuid NOT NULL UNIQUE,
  phone text NOT NULL UNIQUE,
  business_type text NOT NULL DEFAULT 'shop',
  business_name text,
  shop_name text,
  owner_name text,
  email text,
  image_url text,
  address text,
  city text,
  pincode text,
  latitude double precision,
  longitude double precision,
  gst_number text,
  pan_number text,
  registration_number text,
  bank_account_name text,
  bank_name text,
  bank_ifsc text,
  bank_upi text,
  status text NOT NULL DEFAULT 'pending',
  registration_complete boolean NOT NULL DEFAULT false,
  details jsonb NOT NULL DEFAULT '{}'::jsonb,
  created_at timestamptz NOT NULL DEFAULT now(),
  updated_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.partners TO authenticated;
GRANT ALL ON public.partners TO service_role;
ALTER TABLE public.partners ENABLE ROW LEVEL SECURITY;
CREATE POLICY "partners_own" ON public.partners FOR ALL TO authenticated
  USING (user_id = auth.uid()) WITH CHECK (user_id = auth.uid());

CREATE OR REPLACE FUNCTION public.owns_partner(_partner_id uuid)
RETURNS boolean LANGUAGE sql STABLE SECURITY DEFINER SET search_path = public AS $$
  SELECT EXISTS (SELECT 1 FROM public.partners p WHERE p.id = _partner_id AND p.user_id = auth.uid());
$$;

CREATE OR REPLACE FUNCTION public.touch_updated_at()
RETURNS trigger LANGUAGE plpgsql SET search_path = public AS $$
BEGIN NEW.updated_at = now(); RETURN NEW; END; $$;

CREATE TRIGGER partners_touch BEFORE UPDATE ON public.partners
FOR EACH ROW EXECUTE FUNCTION public.touch_updated_at();

CREATE TABLE public.partner_drafts (
  user_id uuid PRIMARY KEY,
  step integer NOT NULL DEFAULT 1,
  data jsonb NOT NULL DEFAULT '{}'::jsonb,
  updated_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.partner_drafts TO authenticated;
GRANT ALL ON public.partner_drafts TO service_role;
ALTER TABLE public.partner_drafts ENABLE ROW LEVEL SECURITY;
CREATE POLICY "drafts_own" ON public.partner_drafts FOR ALL TO authenticated
  USING (user_id = auth.uid()) WITH CHECK (user_id = auth.uid());

CREATE TABLE public.partner_login_codes (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  phone text NOT NULL,
  code_hash text NOT NULL,
  attempts integer NOT NULL DEFAULT 0,
  consumed boolean NOT NULL DEFAULT false,
  expires_at timestamptz NOT NULL,
  created_at timestamptz NOT NULL DEFAULT now()
);
CREATE INDEX partner_login_codes_phone_idx ON public.partner_login_codes (phone, created_at DESC);
GRANT ALL ON public.partner_login_codes TO service_role;
ALTER TABLE public.partner_login_codes ENABLE ROW LEVEL SECURITY;

CREATE TABLE public.partner_services (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  partner_id uuid NOT NULL REFERENCES public.partners(id) ON DELETE CASCADE,
  category text NOT NULL,
  vehicle_types text[] NOT NULL DEFAULT '{}',
  price numeric,
  price_unit text,
  coverage_radius_km integer NOT NULL DEFAULT 10,
  operating_hours jsonb NOT NULL DEFAULT '{}'::jsonb,
  is_24x7 boolean NOT NULL DEFAULT false,
  emergency_support boolean NOT NULL DEFAULT false,
  active boolean NOT NULL DEFAULT true,
  created_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.partner_services TO authenticated;
GRANT ALL ON public.partner_services TO service_role;
ALTER TABLE public.partner_services ENABLE ROW LEVEL SECURITY;
CREATE POLICY "services_own" ON public.partner_services FOR ALL TO authenticated
  USING (public.owns_partner(partner_id)) WITH CHECK (public.owns_partner(partner_id));

CREATE TABLE public.partner_documents (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  partner_id uuid NOT NULL REFERENCES public.partners(id) ON DELETE CASCADE,
  doc_type text NOT NULL,
  file_url text,
  file_name text,
  status text NOT NULL DEFAULT 'pending',
  created_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.partner_documents TO authenticated;
GRANT ALL ON public.partner_documents TO service_role;
ALTER TABLE public.partner_documents ENABLE ROW LEVEL SECURITY;
CREATE POLICY "documents_own" ON public.partner_documents FOR ALL TO authenticated
  USING (public.owns_partner(partner_id)) WITH CHECK (public.owns_partner(partner_id));

CREATE TABLE public.partner_team (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  partner_id uuid NOT NULL REFERENCES public.partners(id) ON DELETE CASCADE,
  name text NOT NULL,
  phone text,
  email text,
  role text NOT NULL DEFAULT 'technician',
  permissions text[] NOT NULL DEFAULT '{}',
  status text NOT NULL DEFAULT 'invited',
  created_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.partner_team TO authenticated;
GRANT ALL ON public.partner_team TO service_role;
ALTER TABLE public.partner_team ENABLE ROW LEVEL SECURITY;
CREATE POLICY "team_own" ON public.partner_team FOR ALL TO authenticated
  USING (public.owns_partner(partner_id)) WITH CHECK (public.owns_partner(partner_id));

CREATE TABLE public.partner_subscriptions (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  partner_id uuid NOT NULL REFERENCES public.partners(id) ON DELETE CASCADE,
  plan_name text NOT NULL DEFAULT 'Standard',
  status text NOT NULL DEFAULT 'active',
  price numeric NOT NULL DEFAULT 0,
  billing_cycle text NOT NULL DEFAULT 'monthly',
  started_at timestamptz NOT NULL DEFAULT now(),
  renews_at timestamptz NOT NULL DEFAULT (now() + interval '30 days'),
  features jsonb NOT NULL DEFAULT '[]'::jsonb,
  usage_limits jsonb NOT NULL DEFAULT '{}'::jsonb,
  outstanding_amount numeric NOT NULL DEFAULT 0,
  created_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.partner_subscriptions TO authenticated;
GRANT ALL ON public.partner_subscriptions TO service_role;
ALTER TABLE public.partner_subscriptions ENABLE ROW LEVEL SECURITY;
CREATE POLICY "subs_own" ON public.partner_subscriptions FOR ALL TO authenticated
  USING (public.owns_partner(partner_id)) WITH CHECK (public.owns_partner(partner_id));

CREATE TABLE public.partner_invoices (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  partner_id uuid NOT NULL REFERENCES public.partners(id) ON DELETE CASCADE,
  invoice_number text NOT NULL,
  amount numeric NOT NULL DEFAULT 0,
  status text NOT NULL DEFAULT 'paid',
  issued_at timestamptz NOT NULL DEFAULT now(),
  paid_at timestamptz,
  created_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.partner_invoices TO authenticated;
GRANT ALL ON public.partner_invoices TO service_role;
ALTER TABLE public.partner_invoices ENABLE ROW LEVEL SECURITY;
CREATE POLICY "invoices_own" ON public.partner_invoices FOR ALL TO authenticated
  USING (public.owns_partner(partner_id)) WITH CHECK (public.owns_partner(partner_id));

CREATE TABLE public.partner_requests (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  partner_id uuid NOT NULL REFERENCES public.partners(id) ON DELETE CASCADE,
  reference text NOT NULL,
  customer_name text NOT NULL,
  customer_phone text,
  vehicle text,
  issue text,
  service_category text,
  location text,
  status text NOT NULL DEFAULT 'new',
  amount numeric NOT NULL DEFAULT 0,
  rating numeric,
  assigned_to text,
  response_minutes integer,
  scheduled_at timestamptz,
  created_at timestamptz NOT NULL DEFAULT now(),
  updated_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.partner_requests TO authenticated;
GRANT ALL ON public.partner_requests TO service_role;
ALTER TABLE public.partner_requests ENABLE ROW LEVEL SECURITY;
CREATE POLICY "requests_own" ON public.partner_requests FOR ALL TO authenticated
  USING (public.owns_partner(partner_id)) WITH CHECK (public.owns_partner(partner_id));
CREATE TRIGGER partner_requests_touch BEFORE UPDATE ON public.partner_requests
FOR EACH ROW EXECUTE FUNCTION public.touch_updated_at();

CREATE TABLE public.partner_tickets (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  partner_id uuid NOT NULL REFERENCES public.partners(id) ON DELETE CASCADE,
  subject text NOT NULL,
  category text NOT NULL DEFAULT 'general',
  message text,
  status text NOT NULL DEFAULT 'open',
  created_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.partner_tickets TO authenticated;
GRANT ALL ON public.partner_tickets TO service_role;
ALTER TABLE public.partner_tickets ENABLE ROW LEVEL SECURITY;
CREATE POLICY "tickets_own" ON public.partner_tickets FOR ALL TO authenticated
  USING (public.owns_partner(partner_id)) WITH CHECK (public.owns_partner(partner_id));

CREATE TABLE public.partner_settings (
  partner_id uuid PRIMARY KEY REFERENCES public.partners(id) ON DELETE CASCADE,
  sms_notifications boolean NOT NULL DEFAULT true,
  email_notifications boolean NOT NULL DEFAULT true,
  push_notifications boolean NOT NULL DEFAULT true,
  language text NOT NULL DEFAULT 'en',
  availability boolean NOT NULL DEFAULT true,
  updated_at timestamptz NOT NULL DEFAULT now()
);
GRANT SELECT, INSERT, UPDATE, DELETE ON public.partner_settings TO authenticated;
GRANT ALL ON public.partner_settings TO service_role;
ALTER TABLE public.partner_settings ENABLE ROW LEVEL SECURITY;
CREATE POLICY "settings_own" ON public.partner_settings FOR ALL TO authenticated
  USING (public.owns_partner(partner_id)) WITH CHECK (public.owns_partner(partner_id));
