// src/lib/sites/schema.ts — validation + sanitization for site creation.
// Languages and countries are validated against the canonical Google Ads sets
// (membership), not blind 2-letter regexes — Google Ads codes include zh_CN /
// zh_TW. Legacy "zh" is normalized to zh_CN before validation.
import { z } from "zod";
import {
  normalizeCountryCode,
  normalizeLanguageCode,
} from "@/lib/geo/google-ads";

export const siteInputSchema = z
  .object({
    name: z.string().trim().min(1, "Nom requis").max(120, "Nom trop long"),
    url: z.url("URL invalide").max(255),
    primaryLanguage: z.string(),
    languages: z.array(z.string()).default([]),
    targetCountries: z.array(z.string()).default([]),
  })
  .transform((val, ctx) => {
    // Primary language must be a known Google Ads language code.
    const primary = normalizeLanguageCode(val.primaryLanguage);
    if (!primary) {
      ctx.addIssue({
        code: "custom",
        message: "Langue principale inconnue",
        path: ["primaryLanguage"],
      });
      return z.NEVER;
    }

    // Additional languages: validated, deduped, primary removed (the primary
    // can never also be an additional language).
    const languages: string[] = [];
    for (const raw of val.languages) {
      const code = normalizeLanguageCode(raw);
      if (!code) {
        ctx.addIssue({
          code: "custom",
          message: `Langue inconnue : ${raw}`,
          path: ["languages"],
        });
        return z.NEVER;
      }
      if (code === primary) continue; // never duplicate the primary
      if (!languages.includes(code)) languages.push(code);
    }

    // Target countries: validated membership, deduped, uppercased.
    const targetCountries: string[] = [];
    for (const raw of val.targetCountries) {
      const code = normalizeCountryCode(raw);
      if (!code) {
        ctx.addIssue({
          code: "custom",
          message: `Pays inconnu : ${raw}`,
          path: ["targetCountries"],
        });
        return z.NEVER;
      }
      if (!targetCountries.includes(code)) targetCountries.push(code);
    }

    return {
      name: val.name,
      url: val.url,
      primaryLanguage: primary,
      languages,
      targetCountries,
    };
  });

export type SiteInput = z.input<typeof siteInputSchema>;
export type SiteParsed = z.infer<typeof siteInputSchema>;
