import { MockupOfferProvider } from '../provider/MockupOfferProvider'
import type { OfferDraft, OfferEditableField } from '../domain/offer'
import type { AssetType } from '../domain/enums'

const provider = MockupOfferProvider

type ServiceResult<T> = { data: T; error: null } | { data: null; error: string }

function assetTypeLabel(at: AssetType): string {
  const map: Record<string, string> = {
    OFFICE: 'Bürofläche',
    RETAIL: 'Retailfläche',
    LOGISTICS: 'Logistikfläche',
    LIGHT_INDUSTRIAL: 'Gewerbefläche',
    PRODUCTION: 'Produktionsfläche',
    GASTRO: 'Gastronomiefläche',
    MIXED: 'Mischnutzungsfläche',
    UNKNOWN: 'Fläche',
  }
  return map[at] ?? 'Fläche'
}

function buildEditableFields(
  needTitle: string,
  location: string,
  assetType: AssetType,
  sizeRange: { min: number; max: number },
): OfferEditableField[] {
  return [
    {
      id: 'recipient_salutation',
      label: 'Anrede',
      value: 'Sehr geehrte Damen und Herren',
      fieldType: 'text',
    },
    {
      id: 'offer_intro',
      label: 'Einleitungstext',
      value:
        `vielen Dank für Ihr Interesse an einer ${assetTypeLabel(assetType)} im Raum ${location}. ` +
        `Basierend auf Ihrem Profil "${needTitle}" haben wir Ihnen passende Objekte zusammengestellt.`,
      fieldType: 'textarea',
    },
    {
      id: 'highlighted_criteria',
      label: 'Hervorgehobene Kriterien',
      value: `Flächenbedarf ${sizeRange.min}–${sizeRange.max} m², Standortwunsch ${location}.`,
      fieldType: 'textarea',
    },
    {
      id: 'next_steps',
      label: 'Nächste Schritte',
      value:
        'Gerne arrangieren wir Besichtigungstermine für die aufgeführten Objekte und stehen für Detailfragen zur Verfügung.',
      fieldType: 'textarea',
    },
    {
      id: 'closing',
      label: 'Schlussformel',
      value: 'Freundliche Grüsse\nWincasa AG',
      fieldType: 'textarea',
    },
  ]
}

export const offerService = {
  async createOfferDraft(
    needId: string,
    selectedPropertyIds: string[],
    needTitle: string,
    location: string,
    assetType: AssetType,
    sizeRange: { min: number; max: number },
  ): Promise<ServiceResult<OfferDraft>> {
    try {
      const editableFields = buildEditableFields(needTitle, location, assetType, sizeRange)
      const data = await provider.create({
        needId,
        selectedPropertyIds,
        subject: `Passende Gewerbeflächen zu Ihrer Anfrage: ${needTitle}`,
        message:
          'Sehr geehrte Damen und Herren,\n\nbitte finden Sie anbei unser Angebot mit den passenden Objekten.\n\nFreundliche Grüsse\nWincasa AG',
        editableFields,
      })
      return { data, error: null }
    } catch (e) {
      return { data: null, error: e instanceof Error ? e.message : 'Unbekannter Fehler' }
    }
  },

  async updateOfferField(
    offerDraftId: string,
    fieldId: string,
    value: string,
  ): Promise<ServiceResult<OfferDraft>> {
    try {
      const data = await provider.updateField(offerDraftId, fieldId, value)
      return { data, error: null }
    } catch (e) {
      return { data: null, error: e instanceof Error ? e.message : 'Unbekannter Fehler' }
    }
  },

  async markOfferChecked(offerDraftId: string): Promise<ServiceResult<OfferDraft>> {
    try {
      const data = await provider.updateStatus(offerDraftId, 'checked')
      return { data, error: null }
    } catch (e) {
      return { data: null, error: e instanceof Error ? e.message : 'Unbekannter Fehler' }
    }
  },

  async generatePdfPreview(
    offerDraftId: string,
  ): Promise<ServiceResult<{ previewReady: true; pdfUrl: string }>> {
    try {
      await new Promise(r => setTimeout(r, 900))
      const pdfUrl = `mock://offers/${offerDraftId}.pdf`
      await provider.setPdfUrl(offerDraftId, pdfUrl)
      return { data: { previewReady: true, pdfUrl }, error: null }
    } catch (e) {
      return { data: null, error: e instanceof Error ? e.message : 'Unbekannter Fehler' }
    }
  },

  async sendOffer(offerDraftId: string): Promise<ServiceResult<OfferDraft>> {
    try {
      await new Promise(r => setTimeout(r, 700))
      const data = await provider.updateStatus(offerDraftId, 'sent')
      return { data, error: null }
    } catch (e) {
      return { data: null, error: e instanceof Error ? e.message : 'Unbekannter Fehler' }
    }
  },
}
