// Melsens — C4-model (LikeC4). Single source of truth for arkitektur-diagrammer.
// Render lokalt:  npx likec4@1.59.1 serve         (interaktiv preview)
//                 npx likec4@1.59.1 export png -o assets   (billeder til MkDocs)
// Se arkitektur/c4/README.md for konventioner. NB: C4-"container" ≠ Docker-container.

specification {
  element actor {
    style {
      shape person
    }
  }
  element system
  element container
  element component

  tag external
  color melsens #7c3aed
}

model {
  besogende = actor 'Besøgende' 'Slutbruger der besøger et kunde-website'
  smvKunde  = actor 'SMV-kunde' 'Ejer af et website hos Melsens'
  operator  = actor 'Melsens-operatør' 'Allan / Danny'

  // Eksterne systemer
  frisbii = system 'Frisbii + MobilePay' {
    #external
    description 'Billing-motor + betaling (engangs + recurring)'
  }
  dinero = system 'Dinero' {
    #external
    description 'Regnskab, moms og fakturaer'
  }
  cloudflare = system 'Cloudflare' {
    #external
    description 'Hosting, edge, kunde-domæner + SSL'
  }
  claude = system 'Claude / AI' {
    #external
    description 'AI-agenter der bygger og driver'
  }

  // Melsens-systemer
  websiteos = system 'Website OS' {
    description 'Delt multi-tenant platform bag tusindvis af SMV-websites (produktlinje B)'

    web = container 'Web-renderer' {
      technology 'TypeScript, Next.js'
      description 'Server kunde-websites — config-drevet, multi-tenant'
    }
    admin = container 'Admin-portal' {
      technology 'TypeScript, Next.js'
      description 'Kunde-selvbetjening: indhold + modul-tilkøb'
    }
    cms = container 'Indholdsmodel / CMS' {
      technology 'Payload'
      description 'Struktureret block-indhold + versionering'
    }
    workers = container 'Agent-workflows' {
      technology 'Inngest'
      description 'Durable AI-pipelines (onboarding, QA) + kø'
    }
    billing = container 'Billing-adapter' {
      technology 'TypeScript'
      description 'Entitlements → abonnement → opkrævning'
    }
    db = container 'Database' {
      technology 'Neon Postgres (RLS)'
      description 'Tenant-data, indhold og entitlements — multi-tenant + Row-Level Security'
      style {
        shape cylinder
      }
    }

    // Relationer inde i systemet
    admin -> cms 'redigerer indhold via'
    web -> db 'læser tenant-indhold'
    admin -> db 'skriver indhold + config'
    cms -> db 'gemmer indhold'
    workers -> db 'læser / skriver'
    billing -> db 'læser entitlements'
    admin -> billing 'modul-tilkøb → abonnement'
  }

  // Nyt september-oplæg holdes adskilt fra den historiske Website OS-model.
  factoryD1 = system 'Website Factory — D1-oplæg' {
    description 'DISKUSSIONSOPLÆG 2026-09-07: operatørstyret pilot; ingen ny ADR eller eksisterende deployment'

    app = container 'Delt website og administration' {
      technology 'TypeScript, Next.js, Cloudflare Workers'
      description 'Én runtime: verificeret hostname, kundeadgang, skabeloner, versionering og godkendt publicering'
    }
    platform = container 'Platformdatabase' {
      technology 'Cloudflare D1'
      description 'Kunder, medlemskaber, verificerede domæner, bindingsregister og jobs'
      style { shape cylinder }
    }
    customerA = container 'Kundedatabase A' {
      technology 'Cloudflare D1'
      description 'A: identitet, indholdsversioner, publiceret indhold, moduler, henvendelser og outbox'
      style { shape cylinder }
    }
    customerB = container 'Kundedatabase B' {
      technology 'Cloudflare D1'
      description 'B: samme schema, separate data; fælles Worker kan tilgå begge databaser'
      style { shape cylinder }
    }
    media = container 'Kundemedier' {
      technology 'Cloudflare R2'
      description 'Ejerskab og adgangskontrol; private kladder adskilt fra godkendte offentlige medier'
      style { shape storage }
    }
    provisioning = container 'Betroet provisionering og udgivelse' {
      technology 'Scripts, GitHub Actions'
      description 'Management-credentials uden for app; migrationer, serialiserede bindingsudgivelser og identitetskontrol'
    }

    app -> platform 'verificerer kunde, domæne og adgang'
    app -> customerA 'faste operationer via tilladt binding A'
    app -> customerB 'faste operationer via tilladt binding B'
    app -> media 'læser og skriver efter ejerskabs- og adgangskontrol'
    provisioning -> platform 'registrerer jobs og forventet identitet'
    provisioning -> customerA 'opretter og migrerer'
    provisioning -> customerB 'opretter og migrerer'
    provisioning -> app 'udgiver kode og bindings; verificerer før aktivering'
  }

  besogende -> factoryD1.app 'læser publiceret website og sender henvendelse'
  operator -> factoryD1.app 'redigerer, godkender en version og publicerer'
  smvKunde -> operator 'leverer brief, indhold og domæneadgang i manuel pilot'

  isolated = system 'Isolerede kunde-apps' {
    description 'Skræddersyet SaaS pr. kunde, salgbar som kode (produktlinje A)'
  }
  intern = system 'Interne systemer' {
    description 'CRM / pipeline / drift (delvist åben)'
  }

  // Aktør-relationer
  besogende -> websiteos.web 'ser sit website' {
    technology 'HTTPS'
  }
  smvKunde -> websiteos.admin 'redigerer + tilkøber moduler'
  operator -> websiteos.admin 'drifter + supporterer'

  // Eksterne relationer (defineret på mest specifikke niveau; ruller op i højere views)
  websiteos.web -> cloudflare 'hostes på + kunde-domæner/SSL'
  websiteos.workers -> claude 'kalder AI-agenter'
  websiteos.billing -> frisbii 'opkræver (MobilePay/kort)'
  websiteos.billing -> dinero 'synkroniserer faktura + moms'
}

views {
  view index {
    title 'Melsens — System Landskab'
    include *
    exclude websiteos.*
    exclude factoryD1
    exclude factoryD1.*
    autoLayout LeftRight
  }

  view websiteos_context of websiteos {
    title 'Website OS — System Context'
    include *
    exclude websiteos.*
    exclude factoryD1
    exclude factoryD1.*
    autoLayout LeftRight
  }

  view websiteos_container of websiteos {
    title 'Website OS — Containere'
    include *
    exclude factoryD1
    exclude factoryD1.*
    autoLayout TopBottom
  }

  view factory_d1_context of factoryD1 {
    title 'Website Factory — systemkontekst (D1-forslag)'
    include factoryD1, besogende, operator, smvKunde
    autoLayout LeftRight
  }

  view factory_d1_container of factoryD1 {
    title 'Website Factory — containere (D1-forslag, ét miljø)'
    include factoryD1.*, besogende, operator
    autoLayout TopBottom
  }
}
