import { z } from "zod";

/**
 * Türk karakterlerini destekleyen regex deseni
 */
const turkishAlphaPattern = /^[a-zA-ZçÇğĞıİöÖşŞüÜ\s]*$/;

/**
 * Tarih aralığı şeması
 */
export const DateRangeSchema = z
  .object({
    startDate: z.coerce.date({
      required_error: "Başlangıç tarihi zorunludur.",
      invalid_type_error: "Geçersiz başlangıç tarihi.",
    }),
    endDate: z.coerce.date({
      required_error: "Bitiş tarihi zorunludur.",
      invalid_type_error: "Geçersiz bitiş tarihi.",
    }),
  })
  .refine((data) => data.endDate >= data.startDate, {
    message: "Bitiş tarihi başlangıç tarihinden önce olamaz.",
    path: ["endDate"],
  });

/**
 * Mekan/Yer şeması
 */
export const PlaceSchema = z.object({
  id: z.string().optional(),
  name: z
    .string()
    .trim()
    .min(2, "Mekan adı en az 2 karakter olmalıdır.")
    .max(100, "Mekan adı en fazla 100 karakter olabilir.")
    .regex(turkishAlphaPattern, "Mekan adı sadece harf ve boşluk içerebilir."),
  description: z
    .string()
    .trim()
    .max(500, "Açıklama en fazla 500 karakter olabilir.")
    .optional(),
  address: z.string().trim().min(5, "Adres çok kısa.").max(255, "Adres çok uzun."),
  latitude: z.number().min(-90).max(90),
  longitude: z.number().min(-180).max(180),
  category: z.string().optional(),
});

/**
 * Seyahat oluşturma şeması
 */
export const TripCreateSchema = z.object({
  title: z
    .string()
    .trim()
    .min(3, "Seyahat başlığı en az 3 karakter olmalıdır.")
    .max(50, "Seyahat başlığı en fazla 50 karakter olabilir.")
    .regex(turkishAlphaPattern, "Başlık sadece harf ve boşluk içerebilir."),
  description: z
    .string()
    .trim()
    .max(1000, "Açıklama 1000 karakteri geçemez.")
    .optional(),
  destination: z
    .string()
    .trim()
    .min(2, "Varış noktası geçersiz.")
    .regex(turkishAlphaPattern, "Varış noktası sadece harf ve boşluk içerebilir."),
  dateRange: DateRangeSchema,
  isPublic: z.boolean().default(false),
  budget: z.coerce.number().min(0, "Bütçe negatif olamaz.").optional(),
});

/**
 * Seyahat güncelleme şeması (Partial)
 */
export const TripUpdateSchema = TripCreateSchema.partial();

/**
 * Arama sorgusu şeması
 */
export const SearchQuerySchema = z.object({
  q: z
    .string()
    .trim()
    .min(2, "Arama terimi en az 2 karakter olmalıdır.")
    .max(100, "Arama terimi çok uzun."),
  category: z.string().optional(),
  sortBy: z.enum(["date", "popularity", "price"]).optional(),
  order: z.enum(["asc", "desc"]).default("desc"),
});

/**
 * Tip Çıkarımları (Type Inferences)
 * --------------------------------
 * import { TripCreate } from '@/types/validation';
 */
export type DateRange = z.infer<typeof DateRangeSchema>;
export type Place = z.infer<typeof PlaceSchema>;
export type TripCreate = z.infer<typeof TripCreateSchema>;
export type TripUpdate = z.infer<typeof TripUpdateSchema>;
export type SearchQuery = z.infer<typeof SearchQuerySchema>;

/**
 * ENTEGRASYON REHBERİ
 * -------------------
 *
 * 1. API Katmanında Kullanım:
 * ```ts
 * import { TripCreateSchema } from '@/types/validation';
 *
 * async function createTrip(data: unknown) {
 *   const validatedData = TripCreateSchema.parse(data);
 *   // ... Supabase call
 * }
 * ```
 *
 * 2. React Hook Form ile Kullanım:
 * ```tsx
 * import { useForm } from 'react-hook-form';
 * import { zodResolver } from '@hookform/resolvers/zod';
 * import { TripCreateSchema, TripCreate } from '@/types/validation';
 *
 * const form = useForm<TripCreate>({
 *   resolver: zodResolver(TripCreateSchema),
 *   defaultValues: { title: '', isPublic: false }
 * });
 * ```
 */
