/**
 * HTTP layer for /admin/media/* (PLANNING.md §4b). Thin — all rules are in
 * media.service.ts. Multipart parsing is the `uploadSingle` middleware in
 * media.routes.ts; here `req.file` is already on disk.
 */
import type { Request, Response } from 'express';
import { AppError } from '../../lib/AppError';
import { parseBody, parseQuery } from '../../lib/parseRequest';
import {
  listQuerySchema,
  reorderSchema,
  updateImageSchema,
  uploadFieldsSchema,
  visibilitySchema,
} from './media.schema';
import * as media from './media.service';

export async function getCategories(_req: Request, res: Response): Promise<void> {
  res.json({ categories: await media.getCategories() });
}

export async function listImages(req: Request, res: Response): Promise<void> {
  const { page, category, visible } = parseQuery(listQuerySchema, req.query);
  res.json({ images: await media.listImages({ page, category, visible }) });
}

export async function uploadImage(req: Request, res: Response): Promise<void> {
  if (!req.file) throw AppError.validation({ file: 'An image file is required' });
  const fields = parseBody(uploadFieldsSchema, req.body);

  const image = await media.uploadImage({
    page: fields.page,
    categorySlug: fields.category,
    alt: fields.alt,
    caption: fields.caption,
    tmpPath: req.file.path,
    originalName: req.file.originalname,
    sizeBytes: req.file.size,
    createdBy: req.admin!.id,
  });
  res.status(201).json({ image });
}

export async function updateImage(req: Request, res: Response): Promise<void> {
  const patch = parseBody(updateImageSchema, req.body);
  res.json({ image: await media.updateImage(req.params.id, patch) });
}

export async function setVisibility(req: Request, res: Response): Promise<void> {
  const { isVisible } = parseBody(visibilitySchema, req.body);
  res.json({ image: await media.setVisibility(req.params.id, isVisible) });
}

export async function reorder(req: Request, res: Response): Promise<void> {
  const { page, ids } = parseBody(reorderSchema, req.body);
  await media.reorder(page, ids);
  res.json({ ok: true });
}

export async function deleteImage(req: Request, res: Response): Promise<void> {
  await media.deleteImage(req.params.id);
  res.status(204).end();
}
