import { z } from "zod"
import { FirstDayOfWork } from "@garage/api"

export const relationFieldSchema = z
    .object({ value: z.string(), label: z.string() })
    .nullable()

const optionalLatitude = z
    .string()
    .optional()
    .refine(
        (v) => v == null || v === "" || (!Number.isNaN(Number(v)) && Number(v) >= -90 && Number(v) <= 90),
        "Latitude must be between -90 and 90",
    )

const optionalLongitude = z
    .string()
    .optional()
    .refine(
        (v) => v == null || v === "" || (!Number.isNaN(Number(v)) && Number(v) >= -180 && Number(v) <= 180),
        "Longitude must be between -180 and 180",
    )

const optionalUrl = z
    .string()
    .max(255, "Website cannot exceed 255 characters")
    .optional()
    .refine(
        (v) => v == null || v === "" || z.string().url().safeParse(v).success,
        "Enter a valid website URL",
    )

export const settingsFormSchema = z.object({
    name: z.string().min(1, "Name is required").max(100, "Name cannot exceed 100 characters"),
    email: z.union([z.string().email("Invalid email address"), z.literal("")]).optional(),
    phone: z.string().max(30, "Phone cannot exceed 30 characters").optional(),
    alternative_phone: z.string().max(30, "Phone cannot exceed 30 characters").optional(),
    website: optionalUrl,
    time_zone: z.string().max(100, "Time zone cannot exceed 100 characters").optional(),
    upi_id: z.string().max(100, "UPI cannot exceed 100 characters").optional(),
    first_day_of_work: z.union([z.enum(FirstDayOfWork), z.literal("")]).optional(),
    latitude: optionalLatitude,
    longitude: optionalLongitude,
    bank_details: z.string().optional(),
    first_address_line: z.string().max(255, "Address cannot exceed 255 characters").optional(),
    second_address_line: z.string().max(255, "Address cannot exceed 255 characters").optional(),
    country: relationFieldSchema,
    state: relationFieldSchema,
    city: z.string().max(100, "City cannot exceed 100 characters").optional(),
    zip_code: z.string().max(20, "Zip code cannot exceed 20 characters").optional(),
    description: z.string().optional(),
    security: z.string().optional(),
    privacy_policy: z.string().optional(),
    logo: z
        .any()
        .nullable()
        .optional()
        .refine(
            (v) => v == null || v instanceof File,
            "Logo must be an image file",
        ),
})

export type SettingsFormValues = z.infer<typeof settingsFormSchema>
