import { Request, Response } from 'express';
import LegalPage from '../models/legalPage';
import * as legalPageService from '../services/legalPageService';
import { sendResponse, handleError } from '../utils/apiResponse';

// @desc    Get a content page (privacy, terms, user-manual)
// @route   GET /api/admin/legal/:type
// @route   GET /api/user/legal/:type
export const getContentPage = async (req: Request, res: Response): Promise<void> => {
  try {
    const page = await legalPageService.getContentPage(req.params.type);
    sendResponse(res, 200, 'Content page fetched', { page });
  } catch (error) {
    handleError(res, error);
  }
};

// @desc    Update (or create) a content page (privacy, terms, user-manual)
// @route   PUT /api/admin/legal/:type
export const updateContentPage = async (req: Request, res: Response): Promise<void> => {
  try {
    const page = await legalPageService.updateContentPage(req.params.type, req.body ?? {});
    sendResponse(res, 200, 'Content page updated', { page });
  } catch (error) {
    handleError(res, error);
  }
};

// Admin: Create or update a legal page
export const upsertLegalPage = async (req: Request, res: Response) => {
  try {
    let { type, title, content } = req.body;
    if (Array.isArray(type)) type = type[0];
    if (!type || !title || !content) {
      return sendResponse(res, 400, 'type, title, and content are required');
    }
    const page = await LegalPage.findOneAndUpdate(
      { type: type.toLowerCase() },
      { title, content, updatedAt: new Date() },
      { upsert: true, new: true }
    );
    sendResponse(res, 200, 'Legal page saved', { page });
  } catch (error) {
    handleError(res, error);
  }
};

// Public: Get a legal page by type
export const getLegalPage = async (req: Request, res: Response) => {
  try {
    let { type } = req.params;
    if (Array.isArray(type)) type = type[0];
    const page = await LegalPage.findOne({ type: type.toLowerCase() });
    if (!page) return sendResponse(res, 404, 'Legal page not found');
    sendResponse(res, 200, 'Legal page fetched', { page });
  } catch (error) {
    handleError(res, error);
  }
};
