#!/usr/bin/env -S deno run -A
import fastify from "npm:fastify";
// import { parse as jsonParse } from "npm:secure-json-parse";

const server = fastify({ logger: true });

server.get("/anyOf", {
  schema: {
    querystring: {
      type: "object",
      properties: {
        array: {
          anyOf: [
            { type: "array", items: { type: "string" } },
            { type: "string" },
          ],
        },
      },
      required: ["array"],
    },
  },
  handler({ query }) {
    console.log({ ...query });
    return "ok";
  },
});

server.get("/oneOf", {
  schema: {
    querystring: {
      type: "object",
      properties: {
        array: {
          oneOf: [
            { type: "array", items: { type: "string" } },
            { type: "string" },
          ],
        },
      },
      required: ["array"],
    },
  },
  handler({ query }) {
    console.log({ ...query });
    return "ok";
  },
});

// valid
await server.inject(`/anyOf?array=a`);

// invalid: querystring/array must match exactly one schema in oneOf
await server.inject(`/oneOf?array=a`);

/*
server.get("/array", {
  schema: {
    querystring: {
      type: "object",
      properties: { array: { type: "array", items: { type: "string" } } },
      required: ["array"],
    },
  },
  async preValidation(req) {
    req.query.array = [req.query.array].flat().flatMap((s) => {
      try {
        const parsed = jsonParse(s);
        return Array.isArray(parsed) ? parsed : [s];
      } catch {
        return [s];
      }
    });
  },
  handler({ query }) {
    console.log({ ...query });
    return "ok";
  },
});

// valid
await server.inject(`/array?array=["123",4]`);
*/

/*
server.get("/dateTime", {
  schema: {
    querystring: {
      type: "object",
      properties: { dateTime: { type: "string", format: "date-time" } },
      required: ["dateTime"],
    },
  },
  handler() {
    return "ok";
  },
});

// valid
await server.inject("/dateTime?dateTime=2021-09-10T15:30:00Z");

// valid: fasitfy@4.22.2, invalid fastify@5.1.0: querystring/dateTime must match format "date-time"
await server.inject("/dateTime?dateTime=2021-09-10T15:30:00");

// invalid: querystring/dateTime must match format "date-time"
await server.inject("/dateTime?dateTime=2021-09-10");
*/