import { z } from "zod";

export const coverageOnWhomSchema = z.enum(["primary", "spouse", "both"]);

export const impairmentSchema = z.object({
  module: z.string(),
  attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])),
  path_answers: z.array(z.string()).optional(),
});

export const decisionResultSchema = z.object({
  offer_family: z.enum(["si_level", "graded", "gi", "postpone", "decline"]),
  reasons: z.array(z.string()),
  drivers: z.array(z.string()),
  suggested_next_step: z.string(),
});

export const applicantProfileSchema = z.object({
  intent: z.literal("mortgage_protection").nullable().optional(),
  name: z.string().optional(),
  phone: z.string().optional(),
  email: z.string().optional(),
  age: z.number().optional(),
  date_of_birth: z.string().optional(),
  sex: z.string().optional(),
  state: z.string().optional(),
  citizenship_residency: z.string().optional(),
  height_ft_in: z.string().optional(),
  weight_lb: z.number().optional(),
  bmi_computed: z.number().optional(),
  build_class_label: z.string().optional(),
  diabetic_build_path: z.boolean().optional(),
  tobacco_products: z.array(z.string()).optional(),
  months_since_last_use: z.number().optional(),
  nicotine_class: z.string().optional(),
  tobacco_answered: z.boolean().optional(),
  impairments: z.array(impairmentSchema).optional(),
  disease_screens: z
    .record(z.string(), z.enum(["yes", "no", "unsure"]))
    .optional(),
  diseases_complete: z.boolean().optional(),
  diseases_none_reported: z.boolean().optional(),
  annual_income: z.number().optional(),
  spouse_annual_income: z.number().optional(),
  net_worth: z.number().optional(),
  existing_coverage_amount: z.number().optional(),
  bankruptcy_years: z.number().optional(),
  marital_status: z.string().optional(),
  spouse_age_sex: z.string().optional(),
  spouse_tobacco: z.string().optional(),
  spouse_impairments_summary: z.string().optional(),
  dependent_children_count: z.number().optional(),
  beneficiary_relationship: z.string().optional(),
  loan_balance: z.number().optional(),
  loan_term_years: z.number().optional(),
  property_state: z.string().optional(),
  co_borrower_flag: z.boolean().optional(),
  coverage_on_whom: coverageOnWhomSchema.optional(),
  monthly_payment: z.number().optional(),
  closing_date: z.string().optional(),
  property_type: z.string().optional(),
  family_history: z.object({ fh_cvd_parent_sibling: z.string().optional() }).optional(),
  labs: z.object({ a1c_bp_etc: z.string().optional() }).optional(),
  decision_result: decisionResultSchema.optional(),
  carrier_shortlist: z.array(z.string()).optional(),
  agent_handoff_ack: z.boolean().optional(),
});

export type ApplicantProfile = z.infer<typeof applicantProfileSchema>;

export const emptyProfile = (): ApplicantProfile => ({ intent: null });

export const modelChatResponseSchema = z.object({
  reply_to_customer: z.string(),
  profile_patch: applicantProfileSchema.partial().optional().default({}),
  suggested_step: z.number().optional(),
  stop_path: z.string().nullable().optional(),
  emergency_stop: z.boolean().optional(),
});
