import { z } from 'zod'
import { optionalTextField, optionalTitleCaseAllField, optionalUpperField, optionalEmailField, optionalPhoneField } from '../../lib/zodValidation'

export const companySchema = z.object({
  name:    optionalTextField('commercialName'),
  email:   optionalEmailField(),
  phone:   optionalPhoneField(),
  address: z.record(z.unknown()).optional(),
})

export const brandSchema = z.object({
  displayName:            z.string().min(1).optional(),
  tagline:                z.string().optional(),
  primaryColor:           z.string().optional(),
  accentColor:            z.string().optional(),
  publicEmail:            optionalEmailField(),
  publicPhone:            optionalPhoneField(),
  publicAddress:          z.string().optional(),
  publicCity:             optionalTextField('city'),
  publicCountry:          optionalTextField('country'),
  websiteUrl:             z.string().url().optional(),
  whatsappNumber:         z.string().optional(),
  defaultLocale:          z.string().optional(),
  defaultCurrency:        z.literal('MAD').optional(),
  amanpayMerchantId:      z.string().optional(),
  amanpaySecretKey:       z.string().optional(),
  paypalEmail:            optionalEmailField(),
  paypalMerchantId:       z.string().optional(),
  isListedOnCarplace:  z.boolean().optional(),
  homePageConfig: z.object({
    heroTitle:              z.union([z.string(), z.null()]).optional(),
    heroDescription:        z.union([z.string(), z.null()]).optional(),
    viewOffersLabel:        z.union([z.string(), z.null()]).optional(),
    viewPricingLabel:       z.union([z.string(), z.null()]).optional(),
    contactCompanyLabel:    z.union([z.string(), z.null()]).optional(),
    activeOffersTitle:      z.union([z.string(), z.null()]).optional(),
    seeAllOffersLabel:      z.union([z.string(), z.null()]).optional(),
    noActiveOffersLabel:    z.union([z.string(), z.null()]).optional(),
    publishedVehiclesTitle: z.union([z.string(), z.null()]).optional(),
    viewVehicleLabel:       z.union([z.string(), z.null()]).optional(),
    pricingEyebrow:         z.union([z.string(), z.null()]).optional(),
    pricingTitle:           z.union([z.string(), z.null()]).optional(),
    pricingDescription:     z.union([z.string(), z.null()]).optional(),
    showOffers:     z.boolean().optional(),
    showVehicles:   z.boolean().optional(),
    showPricing:    z.boolean().optional(),
    layout: z.object({
      items: z.array(z.object({
        id:   z.string().min(1),
        type: z.enum(['hero', 'offers', 'vehicles', 'pricing']),
        x: z.number().int().min(1),
        y: z.number().int().min(1),
        w: z.number().int().min(1),
        h: z.number().int().min(1),
      })),
    }).optional(),
  }).optional(),
  menuConfig: z.object({
    aboutLabel:           z.union([z.string(), z.null()]).optional(),
    vehiclesLabel:        z.union([z.string(), z.null()]).optional(),
    offersLabel:          z.union([z.string(), z.null()]).optional(),
    pricingLabel:         z.union([z.string(), z.null()]).optional(),
    blogLabel:            z.union([z.string(), z.null()]).optional(),
    contactLabel:         z.union([z.string(), z.null()]).optional(),
    bookCarLabel:         z.union([z.string(), z.null()]).optional(),
    siteNavigationLabel:  z.union([z.string(), z.null()]).optional(),
    showAbout:    z.boolean().optional(),
    showVehicles: z.boolean().optional(),
    showOffers:   z.boolean().optional(),
    showPricing:  z.boolean().optional(),
    showBlog:     z.boolean().optional(),
    showContact:  z.boolean().optional(),
    pageSections: z.object({
      home: z.object({
        hero: z.boolean().optional(), offers: z.boolean().optional(),
        vehicles: z.boolean().optional(), pricing: z.boolean().optional(),
      }).optional(),
      about: z.object({
        hero: z.boolean().optional(), highlights: z.boolean().optional(), details: z.boolean().optional(),
      }).optional(),
      offers: z.object({ header: z.boolean().optional(), grid: z.boolean().optional() }).optional(),
      pricing: z.object({
        hero: z.boolean().optional(), plans: z.boolean().optional(),
        payments: z.boolean().optional(), faq: z.boolean().optional(),
      }).optional(),
      vehicles: z.object({
        header: z.boolean().optional(), filters: z.boolean().optional(), grid: z.boolean().optional(),
      }).optional(),
      vehicleDetail: z.object({ gallery: z.boolean().optional(), summary: z.boolean().optional() }).optional(),
      blog: z.object({ hero: z.boolean().optional(), posts: z.boolean().optional() }).optional(),
      contact: z.object({ content: z.boolean().optional() }).optional(),
      booking: z.object({ content: z.boolean().optional() }).optional(),
      bookingConfirmation: z.object({
        hero: z.boolean().optional(), summary: z.boolean().optional(), actions: z.boolean().optional(),
      }).optional(),
    }).optional(),
  }).optional(),
})

export const contractSettingsSchema = z.object({
  legalName:              optionalTitleCaseAllField('legalCompanyName'),
  registrationNumber:     optionalUpperField('commercialRegistry'),
  taxId:                  z.string().optional(),
  terms:                  z.string().optional(),
  fuelPolicy:             z.string().optional(),
  depositPolicy:          z.string().optional(),
  lateFeePolicy:          z.string().optional(),
  damagePolicy:           z.string().optional(),
  contractFooterNote:     z.string().optional(),
  invoiceFooterNote:      z.string().optional(),
  signatureRequired:      z.boolean().optional(),
  showTax:                z.boolean().optional(),
  taxRate:                z.number().optional(),
  taxLabel:               z.string().optional(),
  fuelPolicyType:         z.enum(['FULL_TO_FULL', 'FULL_TO_EMPTY', 'SAME_TO_SAME', 'PREPAID', 'FREE']).optional(),
  fuelPolicyNote:         z.string().optional(),
  fuelChargePerLiter:     z.number().int().optional(),
  fuelShortfallFee:       z.number().int().optional(),
  lateFeePerHour:         z.number().int().optional(),
  additionalDriverCharge: z.enum(['FREE', 'PER_DAY', 'FLAT']).optional(),
  additionalDriverDailyRate: z.number().int().optional(),
  additionalDriverFlatRate:  z.number().int().optional(),
})

export const insurancePolicySchema = z.object({
  name:         z.string().min(1),
  description:  z.string().optional(),
  type:         z.enum(['CDW', 'SCDW', 'THEFT', 'THIRD_PARTY', 'FULL', 'BASIC', 'ROADSIDE', 'PERSONAL', 'CUSTOM']),
  chargeType:   z.enum(['PER_DAY', 'PER_RENTAL', 'PERCENTAGE_OF_RENTAL']),
  chargeValue:  z.number().int().min(0),
  isRequired:   z.boolean().default(false),
  isActive:     z.boolean().default(true),
  sortOrder:    z.number().int().default(0),
})

export const pricingRuleSchema = z.object({
  name:            z.string().min(1),
  type:            z.enum(['SURCHARGE', 'DISCOUNT']),
  condition:       z.enum(['AGE_LESS_THAN', 'AGE_GREATER_THAN', 'LICENSE_YEARS_LESS_THAN', 'LICENSE_YEARS_GREATER_THAN']),
  conditionValue:  z.number().int(),
  adjustmentType:  z.enum(['PERCENTAGE', 'FLAT_PER_DAY', 'FLAT_TOTAL']),
  adjustmentValue: z.number().int(),
  isActive:        z.boolean().default(true),
  description:     z.string().optional(),
})

export const accountingSettingsSchema = z.object({
  reportingPeriod:  z.enum(['WEEKLY', 'MONTHLY', 'QUARTERLY', 'ANNUAL']).optional(),
  fiscalYearStart:  z.number().int().min(1).max(12).optional(),
  currency:         z.literal('MAD').optional(),
  accountantEmail:  optionalEmailField(),
  accountantName:   optionalTextField('name'),
  autoSendReport:   z.boolean().optional(),
  reportFormat:     z.enum(['PDF', 'CSV', 'BOTH']).optional(),
})

export const subdomainSchema     = z.object({ subdomain: z.string().min(3) })
export const customDomainSchema  = z.object({ customDomain: z.string().min(3) })
export const idParamSchema       = z.object({ id: z.string() })
