import { z } from 'zod';

export type PostFormValues = {
    title: { id: string; en: string };
    slug: { id: string; en: string };
    excerpt: { id: string; en: string };
    body: { id: string; en: string };
    blog_category_ids: string[];
    status: 'draft' | 'scheduled' | 'published';
    published_at: string;
    reading_time: number;
};

const translatableField = (max: number) =>
    z.object({
        id: z.string().max(max, `Maksimal ${max} karakter`),
        en: z.string().max(max, `Maksimal ${max} karakter`),
    });

const slugField = (max: number) =>
    z.object({
        id: z
            .string()
            .max(max, `Maksimal ${max} karakter`)
            .regex(
                /^[a-z0-9]+(?:-[a-z0-9]+)*$/,
                'Format slug tidak valid (huruf kecil & tanda hubung)',
            ),
        en: z
            .string()
            .max(max, `Maksimal ${max} karakter`)
            .regex(
                /^[a-z0-9]+(?:-[a-z0-9]+)*$/,
                'Invalid slug format (lowercase & hyphens)',
            ),
    });

export const postSchema = z.object({
    title: translatableField(255).superRefine((value, ctx) => {
        if (!value.id.trim()) {
            ctx.addIssue({
                code: 'custom',
                message: 'Judul (ID) wajib diisi',
                path: ['id'],
            });
        }

        if (!value.en.trim()) {
            ctx.addIssue({
                code: 'custom',
                message: 'Title (EN) is required',
                path: ['en'],
            });
        }
    }),
    slug: slugField(255).superRefine((value, ctx) => {
        if (!value.id.trim()) {
            ctx.addIssue({
                code: 'custom',
                message: 'Slug (ID) wajib diisi',
                path: ['id'],
            });
        }

        if (!value.en.trim()) {
            ctx.addIssue({
                code: 'custom',
                message: 'Slug (EN) is required',
                path: ['en'],
            });
        }
    }),
    excerpt: translatableField(500),
    body: translatableField(20000).superRefine((value, ctx) => {
        if (!stripHtml(value.id).trim()) {
            ctx.addIssue({
                code: 'custom',
                message: 'Konten (ID) wajib diisi',
                path: ['id'],
            });
        }

        if (!stripHtml(value.en).trim()) {
            ctx.addIssue({
                code: 'custom',
                message: 'Content (EN) is required',
                path: ['en'],
            });
        }
    }),
    blog_category_ids: z.array(z.string()).optional(),
    status: z.enum(['draft', 'scheduled', 'published']),
    published_at: z.string().optional(),
    reading_time: z.number().int().min(1).max(120),
}) as unknown as z.ZodType<PostFormValues, PostFormValues>;

const stripHtml = (html: string) => {
    const doc = new DOMParser().parseFromString(html, 'text/html');

    return doc.body.textContent ?? '';
};
