export type ShippingMethodSetting = {
  id: string
  name: string
  price: number
  days: number
  type: 'home_delivery' | 'pickup_point' | 'zbox'
  carrier: 'czech_post' | 'ppl' | 'packeta' | 'gls' | 'dpd'
  requiresLocation: boolean
  enabled: boolean
  sortOrder: number
}

export type ShippingSettings = {
  version: 1
  methods: ShippingMethodSetting[]
}

export const defaultShippingMethods: ShippingMethodSetting[] = [
  { id: 'czech_post_balikovny', name: 'Balíkovna', price: 89, days: 3, type: 'pickup_point', carrier: 'czech_post', requiresLocation: true, enabled: true, sortOrder: 10 },
  { id: 'ppl_pickup', name: 'PPL do boxu nebo shopu', price: 109, days: 2, type: 'pickup_point', carrier: 'ppl', requiresLocation: true, enabled: true, sortOrder: 20 },
  { id: 'ppl_home', name: 'PPL na adresu', price: 119, days: 2, type: 'home_delivery', carrier: 'ppl', requiresLocation: false, enabled: true, sortOrder: 30 },
  { id: 'packeta_pickup', name: 'Zásilkovna na výdejní místo', price: 99, days: 2, type: 'pickup_point', carrier: 'packeta', requiresLocation: true, enabled: true, sortOrder: 40 },
  { id: 'packeta_zbox', name: 'Zásilkovna do samoobslužného Z-Boxu', price: 99, days: 2, type: 'zbox', carrier: 'packeta', requiresLocation: true, enabled: true, sortOrder: 50 },
  { id: 'gls_pickup', name: 'GLS do boxu nebo shopu', price: 79, days: 2, type: 'pickup_point', carrier: 'gls', requiresLocation: true, enabled: true, sortOrder: 60 },
  { id: 'gls_home', name: 'GLS na adresu', price: 119, days: 2, type: 'home_delivery', carrier: 'gls', requiresLocation: false, enabled: true, sortOrder: 70 },
  { id: 'dpd_pickup', name: 'DPD do boxu nebo shopu', price: 79, days: 2, type: 'pickup_point', carrier: 'dpd', requiresLocation: true, enabled: true, sortOrder: 80 },
  { id: 'dpd_home', name: 'DPD na adresu', price: 119, days: 2, type: 'home_delivery', carrier: 'dpd', requiresLocation: false, enabled: true, sortOrder: 90 },
]

function record(value: unknown): Record<string, unknown> {
  return value && typeof value === 'object' ? value as Record<string, unknown> : {}
}

function numberInRange(value: unknown, fallback: number, min: number, max: number) {
  const parsed = Number(value)
  return Number.isFinite(parsed) && parsed >= min && parsed <= max ? parsed : fallback
}

export function normalizeShippingSettings(value: unknown): ShippingSettings {
  const root = record(value)
  const storedMethods = Array.isArray(root.methods) ? root.methods.map(record) : []
  return {
    version: 1,
    methods: defaultShippingMethods.map((fallback) => {
      const stored = storedMethods.find((method) => method.id === fallback.id)
      const name = typeof stored?.name === 'string' ? stored.name.trim().slice(0, 120) : ''
      return {
        ...fallback,
        name: name || fallback.name,
        price: Math.round(numberInRange(stored?.price, fallback.price, 0, 10000) * 100) / 100,
        days: Math.round(numberInRange(stored?.days, fallback.days, 1, 30)),
        enabled: typeof stored?.enabled === 'boolean' ? stored.enabled : fallback.enabled,
      }
    }).sort((a, b) => a.sortOrder - b.sortOrder),
  }
}
