import { COOKIE_NAME } from "@shared/const";
import { getSessionCookieOptions } from "./_core/cookies";
import { systemRouter } from "./_core/systemRouter";
import { publicProcedure, router } from "./_core/trpc";
import { z } from "zod";
import { getAllServices, getServiceBySlug, getAllFAQs, getFAQsByCategory, getAllTestimonials, getAllGalleryImages, getAllPublishedBlogPosts, getBlogPostBySlug, getBlogPostsByCategory, createContactSubmission, getContactSubmissions } from "./db";
import { generateSitemap } from "./sitemap";

export const appRouter = router({
  system: systemRouter,
  auth: router({
    me: publicProcedure.query(opts => opts.ctx.user),
    logout: publicProcedure.mutation(({ ctx }) => {
      const cookieOptions = getSessionCookieOptions(ctx.req);
      ctx.res.clearCookie(COOKIE_NAME, { ...cookieOptions, maxAge: -1 });
      return {
        success: true,
      } as const;
    }),
  }),

  // ===== SERVICES =====
  services: router({
    getAll: publicProcedure.query(async () => {
      return await getAllServices();
    }),
    getBySlug: publicProcedure
      .input(z.object({ slug: z.string() }))
      .query(async ({ input }) => {
        return await getServiceBySlug(input.slug);
      }),
  }),

  // ===== FAQs =====
  faqs: router({
    getAll: publicProcedure.query(async () => {
      return await getAllFAQs();
    }),
    getByCategory: publicProcedure
      .input(z.object({ category: z.string() }))
      .query(async ({ input }) => {
        return await getFAQsByCategory(input.category);
      }),
  }),

  // ===== TESTIMONIALS =====
  testimonials: router({
    getAll: publicProcedure.query(async () => {
      return await getAllTestimonials();
    }),
  }),

  // ===== GALLERY =====
  gallery: router({
    getAll: publicProcedure.query(async () => {
      return await getAllGalleryImages();
    }),
  }),

  // ===== BLOG POSTS =====
  blog: router({
    getAllPublished: publicProcedure.query(async () => {
      return await getAllPublishedBlogPosts();
    }),
    getBySlug: publicProcedure
      .input(z.object({ slug: z.string() }))
      .query(async ({ input }) => {
        return await getBlogPostBySlug(input.slug);
      }),
    getByCategory: publicProcedure
      .input(z.object({ category: z.string() }))
      .query(async ({ input }) => {
        return await getBlogPostsByCategory(input.category);
      }),
  }),

  // ===== CONTACT SUBMISSIONS =====
  contact: router({
    submit: publicProcedure
      .input(z.object({
        name: z.string().min(2, "Name must be at least 2 characters"),
        email: z.string().email("Invalid email address"),
        phone: z.string().min(10, "Phone must be at least 10 characters"),
        message: z.string().min(10, "Message must be at least 10 characters"),
        serviceInterest: z.string().optional(),
      }))
      .mutation(async ({ input }) => {
        return await createContactSubmission({
          name: input.name,
          email: input.email,
          phone: input.phone,
          message: input.message,
          serviceInterest: input.serviceInterest,
        });
      }),
    getSubmissions: publicProcedure.query(async ({ ctx }) => {
      // Only admin can view submissions
      if (ctx.user?.role !== 'admin') {
        throw new Error("Unauthorized");
      }
      return await getContactSubmissions();
    }),
  }),

  // ===== SEO =====
  seo: router({
    sitemap: publicProcedure.query(async ({ ctx }) => {
      const baseUrl = `${ctx.req.protocol}://${ctx.req.headers.host}`;
      return await generateSitemap(baseUrl);
    }),
  }),
});

export type AppRouter = typeof appRouter;
