/**
 * Contract (Fulfillment-Rahmenvertrag) form logic — companion to
 * useOfferQuote.ts. The client owns the parameters; the server renders the
 * legal text (server/utils/offers/contractTexts.ts) with these values.
 */

const cNum = (v: any): number => {
  const n = Number(v)
  return Number.isFinite(n) ? n : 0
}

const contractFirstOfNextMonth = (): string => {
  const d = new Date()
  const next = new Date(d.getFullYear(), d.getMonth() + 1, 1)
  const mm = String(next.getMonth() + 1).padStart(2, '0')
  return `${next.getFullYear()}-${mm}-01`
}

/**
 * Build the contract form model from a host-page prefill
 * ({ source, recordId, recordUu?, company, contactName, email, phone, storageQty? }).
 */
export const createContractForm = (prefill: any = {}) => {
  const sq = prefill?.storageQty || {}
  return {
    source: prefill?.source || 'partner',
    recordId: cNum(prefill?.recordId),
    recordUu: prefill?.recordUu || '',
    language: 'de',
    customer: {
      company: prefill?.company || '',
      contactName: prefill?.contactName || '',
      signerPosition: 'Geschäftsführer',
      email: prefill?.email || '',
      phone: prefill?.phone || '',
      street: '',
      zip: '',
      city: '',
      country: 'Deutschland',
      ustId: ''
    },
    assumptions: {
      businessModel: 'B2C',
      plannedStart: contractFirstOfNextMonth(),
      shopSystem: '',
      avgPicksPerOrder: 1.5,
      ordersPerMonth: 500,
      skuCount: 100,
      storage: {
        shelfSmallQty: cNum(sq.shelfSmall),
        shelfLargeQty: cNum(sq.shelfLarge),
        palletQty: cNum(sq.pallet),
        volumeM3: 0
      }
    },
    contract: {
      offerDate: new Date().toISOString().slice(0, 10),
      noticeMonths: 0,
      priceNoticeMonths: 1,
      objectionWeeks: 2,
      curePeriodDays: 3,
      cutoffTime: '14:00',
      paymentMethod: 'transfer',   // auf Rechnung (default); 'sepa' = SEPA-Firmenlastschrift already agreed
      marketingVariant: 'consent',
      includeExpress: false,
      customClauses: [],
      // Deselected contract parts: { key: false }. Keys come from
      // GET /api/offers/contract/sections; absent = included.
      sections: {}
    },
    // Annex package sent with the contract (false = leave out).
    attachments: {
      offer: true,        // Anlage 1 — last sent quote
      agb: true,          // Anlage 2a — stored AGB
      adsp: true,         // Anlage 2b — ADSp 2017 (static)
      logistikagb: true,  // Anlage 2c — Logistik-AGB 2019 (static)
      avv: true,          // Anlage 3 — AVV (Art. 28 DSGVO)
      flyer: false        // Marketing flyer (opt-in, never restored from saved conditions)
    },
    // Digital signing link in the e-mail (valid N days, default 7; or an explicit date).
    signing: {
      enabled: true,
      expiryDays: 7,
      expiresAt: '',
      // Attach the PDFs to the link e-mail too? Off by default — the recipient
      // views/downloads everything in the portal; the signed package is mailed after signing.
      attachDocuments: false
    },
    email: {
      to: prefill?.email || '',
      cc: '',
      subject: '',
      message: ''
    }
  }
}

// Copy every non-empty scalar from src onto keys that exist in target.
const contractFillNonEmpty = (target: any, src: any) => {
  if (!target || !src || typeof src !== 'object') return
  for (const k of Object.keys(target)) {
    const v = src[k]
    if (v !== undefined && v !== null && String(v) !== '' && typeof v !== 'object') target[k] = v
  }
}

/**
 * Apply saved conditions onto a fresh contract form. The record's saved
 * contract section wins; when absent, the shared fields (customer, assumptions)
 * are seeded from the saved QUOTE section so the contract follows the offer.
 */
export const applySavedContractConditions = (form: any, savedContract: any, savedQuote: any = null) => {
  const src = savedContract && typeof savedContract === 'object' ? savedContract : null
  const q = savedQuote && typeof savedQuote === 'object' ? savedQuote : null
  if (!src && !q) return form
  const customer = src?.customer || q?.customer
  contractFillNonEmpty(form.customer, customer)
  const assumptions = src?.assumptions || q?.assumptions
  if (assumptions) {
    contractFillNonEmpty(form.assumptions, assumptions)
    contractFillNonEmpty(form.assumptions.storage, assumptions.storage)
    const today = new Date().toISOString().slice(0, 10)
    if (String(form.assumptions.plannedStart || '') < today) form.assumptions.plannedStart = contractFirstOfNextMonth()
  }
  if (src?.contract) {
    contractFillNonEmpty(form.contract, src.contract)
    if (Array.isArray(src.contract.customClauses)) {
      form.contract.customClauses = src.contract.customClauses.map((c: any) => ({
        title: String(c?.title || ''),
        text: String(c?.text || '')
      }))
    }
    if (src.contract.sections && typeof src.contract.sections === 'object') {
      form.contract.sections = { ...src.contract.sections }
    }
  }
  if (src?.attachments && typeof src.attachments === 'object') {
    for (const k of Object.keys(form.attachments)) {
      if (src.attachments[k] === false) form.attachments[k] = false
    }
  }
  if (src?.signing && typeof src.signing === 'object') {
    if (src.signing.enabled === false) form.signing.enabled = false
    if (Number(src.signing.expiryDays) > 0) form.signing.expiryDays = Number(src.signing.expiryDays)
    if (src.signing.attachDocuments === true) form.signing.attachDocuments = true
  }
  const language = src?.language || q?.language
  if (language === 'en' || language === 'de') form.language = language
  if (!form.email.to && customer?.email) form.email.to = customer.email
  return form
}

/** Assemble the payload for the contract preview/send server routes. */
export const buildContractPayload = (form: any, withEmail = false) => {
  const payload: any = {
    docType: 'contract',
    source: form.source,
    recordId: form.recordId,
    recordUu: form.recordUu || undefined,
    customer: { ...form.customer, country: form.customer.country || 'Deutschland' },
    assumptions: JSON.parse(JSON.stringify(form.assumptions)),
    contract: JSON.parse(JSON.stringify(form.contract)),
    attachments: { ...form.attachments },
    signing: {
      enabled: form.signing?.enabled !== false,
      expiryDays: cNum(form.signing?.expiryDays) || 7,
      expiresAt: form.signing?.expiresAt || '',
      attachDocuments: form.signing?.attachDocuments === true
    },
    meta: {
      language: form.language === 'en' ? 'en' : 'de',
      date: new Date().toISOString().slice(0, 10)
    }
  }
  if (withEmail) {
    payload.email = {
      to: form.email.to.trim(),
      cc: form.email.cc.trim(),
      subject: form.email.subject,
      message: form.email.message
    }
  }
  return payload
}

/** Language-dependent email defaults for sending the contract. */
export const contractEmailDefaults = (language: string, contactName: string, company: string, signingEnabled = true, attachDocuments = true) => {
  const linkOnly = signingEnabled && !attachDocuments
  if (language === 'en') {
    return {
      subject: `Your fulfillment agreement with LogYou – ${company}`,
      message: linkOnly
        ? `Dear ${contactName || 'Sir or Madam'},\n\nthank you for choosing LogYou fulfillment.\n\nYour fulfillment service agreement together with its annexes (offer, terms and conditions, ADSp 2017, Logistik-AGB 2019 and the data processing agreement) is ready for you online.\nVia the button below you can review and download every document at your leisure — clicking it is non-binding and does not sign anything. If you then wish to conclude the agreement, you can sign it on that same page in a separate step, directly in your browser — no printing or scanning needed.\nIf you have any questions, we are happy to help at any time.\n\nBest regards\nYour LogYou team`
        : signingEnabled
        ? `Dear ${contactName || 'Sir or Madam'},\n\nthank you for choosing LogYou fulfillment.\n\nPlease find attached our fulfillment service agreement together with its annexes (offer, terms and conditions, ADSp 2017, Logistik-AGB 2019 and the data processing agreement) as PDFs.\nVia the button below you can also review every document online — clicking it is non-binding and does not sign anything. If you then wish to conclude the agreement, you can sign it on that same page in a separate step, directly in your browser — no printing or scanning needed.\nIf you have any questions, we are happy to help at any time.\n\nBest regards\nYour LogYou team`
        : `Dear ${contactName || 'Sir or Madam'},\n\nthank you for choosing LogYou fulfillment.\n\nPlease find attached our fulfillment service agreement together with its annexes as PDFs. Kindly review them and return a signed copy of the agreement to us.\nIf you have any questions, we are happy to help at any time.\n\nBest regards\nYour LogYou team`
    }
  }
  return {
    subject: `Ihr Fulfillment-Vertrag mit LogYou – ${company}`,
    message: linkOnly
      ? `Guten Tag ${contactName || 'Damen und Herren'},\n\nvielen Dank für Ihr Vertrauen in LogYou Fulfillment.\n\nIhr Fulfillment-Rahmenvertrag mit allen Anlagen (Angebot, AGB, ADSp 2017, Logistik-AGB 2019 und Auftragsverarbeitungsvertrag) steht für Sie online bereit.\nÜber den Button unten können Sie alle Dokumente in Ruhe einsehen und herunterladen — der Klick ist unverbindlich, Sie unterschreiben damit noch nichts. Wenn Sie den Vertrag anschließend abschließen möchten, können Sie ihn auf derselben Seite in einem separaten Schritt direkt im Browser unterschreiben — ganz ohne Ausdrucken und Scannen.\nBei Fragen stehen wir Ihnen jederzeit gerne zur Verfügung.\n\nMit freundlichen Grüßen\nIhr LogYou Team`
      : signingEnabled
      ? `Guten Tag ${contactName || 'Damen und Herren'},\n\nvielen Dank für Ihr Vertrauen in LogYou Fulfillment.\n\nAnbei erhalten Sie unseren Fulfillment-Rahmenvertrag mit allen Anlagen (Angebot, AGB, ADSp 2017, Logistik-AGB 2019 und Auftragsverarbeitungsvertrag) als PDF.\nÜber den Button unten können Sie alle Dokumente zusätzlich online einsehen — der Klick ist unverbindlich, Sie unterschreiben damit noch nichts. Wenn Sie den Vertrag anschließend abschließen möchten, können Sie ihn auf derselben Seite in einem separaten Schritt direkt im Browser unterschreiben — ganz ohne Ausdrucken und Scannen.\nBei Fragen stehen wir Ihnen jederzeit gerne zur Verfügung.\n\nMit freundlichen Grüßen\nIhr LogYou Team`
      : `Guten Tag ${contactName || 'Damen und Herren'},\n\nvielen Dank für Ihr Vertrauen in LogYou Fulfillment.\n\nAnbei erhalten Sie unseren Fulfillment-Rahmenvertrag mit allen Anlagen als PDF. Bitte prüfen Sie die Unterlagen und senden Sie uns ein unterschriebenes Exemplar des Vertrages zurück.\nBei Fragen stehen wir Ihnen jederzeit gerne zur Verfügung.\n\nMit freundlichen Grüßen\nIhr LogYou Team`
  }
}

/** Default "valid until" date for the signing link: today + N days (ISO date). */
export const contractSigningDefaultDate = (days = 7): string => {
  const d = new Date()
  d.setDate(d.getDate() + (Number(days) > 0 ? Number(days) : 7))
  return d.toISOString().slice(0, 10)
}
