import { Prisma } from '@/prisma/generated/client';
import { z } from 'zod';

export type UserInfoType = Prisma.UserGetPayload<{
  include: {
    languagesSpoken: true
    experiences: true
    educations: true
    expertises: true
    Questions: true
  }
}>

const experienceSchema = z.object({
  id: z.union([z.string(), z.number()]).optional(), // Allow both string and number
  companyName: z.string().min(1, "Company Name is required"),
  role: z.string().min(1, "Role is required"),
  startDate: z.union([z.date() , z.string()]).optional(),
  endDate: z.union([z.date() , z.string()]).optional(),
  isCurrent: z.boolean(),
  duration: z.string().optional(),
  description: z.string().optional(),
  userId: z.string().optional()
});

const educationSchema = z.object({
  id: z.number().optional(), // Allow both string and number
  institutionName: z.string().min(1, "Institution Name is required"),
  diplomaTitle: z.string().min(2, "At leasy 2 characters are required"),
  fieldOfStudy: z.string().min(2, "At leasy 2 characters are required"),
  startDate: z.union([z.date() , z.string()]).optional(),
  endDate: z.union([z.date() , z.string()]).optional(),
  isCurrent: z.boolean(),
  duration: z.string().optional(),
  userId: z.string().optional()
});

const expertiseSchema = z.object({
  id: z.number().optional(), // Allow both string and number
  field: z.string().min(1, "At least 1 characters are required").optional(),
  customField: z.string().min(5, "At least 5 characters are required").optional(),
  description: z.string().min(5, "At least 5 characters are required").optional(),
  startDate: z.union([z.date() , z.string()]).optional(),
  endDate: z.union([z.date() , z.string()]).optional(),
  isCurrent: z.boolean(),
  duration: z.string().optional(),
  userId: z.string().optional()
});

export default experienceSchema;

// export type UserInfoType =  
export const accountInfoSchema = z.object({
  email: z.string().email(),
  lastName: z.string().optional().default(''),
  firstName: z.string().optional().default(''),
  username: z.string().optional().default(''), // Aligns with `username` in state
  phone: z.custom().optional(),
  state: z.string().optional().default(''),
  city: z.string().optional().default(''),
  role: z.string(),
  zipCode: z.string().optional().default(''), // Ensure alignment with `zipCode` in state
  rate: z.string().optional().default(''),
  experiences: z.array(experienceSchema).optional(),
  educations: z.array(educationSchema).optional(),
  expertises: z.array(expertiseSchema).optional(),
  countryOfResidence: z.string(),
  languagesSpoken: z.array(z.object({
    id : z.number().optional(),
    name: z.string()
  })).optional().default([]), 
  videos: z.array(z.string()).optional(),
  occupation: z.string().optional().default(''), // Derived from `role` if not explicitly provided
  dateOfBirth: z.union([z.date() , z.string()]).optional(), 
  photoUrl: z.string().nullable().optional(), // Depends on how images are managed
  photoName: z.string().nullable().optional(), // Depends on how images are managed
  biography: z.string().optional().default(''),
  linkedInURL: z.string().optional().default(''),
  instagramURL: z.string().optional().default(''),
  youtubeURL: z.string().optional().default(''),
  spotifyURL: z.string().optional().default(''),
  tiktokURL: z.string().optional().default(''),
  twitterURL: z.string().optional().default(''),
  amazonURL: z.string().optional().default(''),
  websiteURL1: z.string().optional().default(''),
  websiteURL2: z.string().optional().default(''),
  photo: z.instanceof(File, {
    message: "The value must be a File object.",
  }).optional(),
  imageName: z.string().optional(),
});

// Deriving the TypeScript type
export type AccountInfo = z.infer<typeof accountInfoSchema>;

