import { CONSTANTS } from '@/constants/constants';
import { z } from 'zod';

const baseSchema = z.object({
  latitude: z
    .string()
    .nonempty('Latitude is required')
    .regex(/^-?\d+(\.\d+)?$/, 'Invalid latitude format'),
  longitude: z
    .string()
    .nonempty('Longitude is required')
    .regex(/^-?\d+(\.\d+)?$/, 'Invalid longitude format'),
  country: z.string().optional(), 
});

export const areaSchema = baseSchema.extend({
  area: z.string().nonempty('Area is required'),
  city: z.string().nonempty('City is required'),
  pincodes: z
    .array(
      z.object({
        code: z
          .union([z.string(), z.number()])
          .transform((val) => {
            const strVal = val?.toString?.() ?? '';
            return strVal.trim();
          })
          .refine((val) => val !== '', {
            message: 'Pincode is required',
          })
          .refine((val) => /^\d{6}$/.test(val), {
            message: 'Pincode must be exactly 6 digits',
          }),
      })
    )
    .min(1, 'At least one pincode is required'),
});

export const stateSchema = baseSchema.extend({
  state: z.string().nonempty('State is required'),
  country: z.string().nonempty('Country is required'),
});

export const citySchema = baseSchema.extend({
  city: z.string().nonempty('City is required'),
  state: z.string().nonempty('State is required'),
});

const countrySchema = baseSchema.extend({
  country: z.string().nonempty('Country is required'),
});

export function getLocationSchema(location: 'area' | 'state' | 'country' | 'city') {
  switch (location) {
    case CONSTANTS.AREA:
      return areaSchema;
    case CONSTANTS.STATE:
      return stateSchema;
    case CONSTANTS.CITY:
      return citySchema;
    case CONSTANTS.COUNTRY:
      return countrySchema;
    default:
      return baseSchema;
  }
}
