# -*- mode: Python -*-

# EntKube Tiltfile — Helm-based local Kubernetes development
#
# Prerequisites:
#   - Docker Desktop or Rancher Desktop
#   - k3d (recommended): k3d cluster create entkube --registry-create entkube-registry:0.0.0.0:5050 -p "8080:80@loadbalancer"
#   - Tilt: https://docs.tilt.dev/install.html
#   - Helm 3
#
# Usage:
#   tilt up
#
# This watches source code, rebuilds Docker images, and redeploys via Helm.

# Allow the k3d local registry
allow_k8s_contexts(['k3d-entkube'])

# Use the local registry created by k3d
default_registry('localhost:5050')

# Docker builds for each service — context is the repo root so COPY paths work
docker_build(
    'entkube/web',
    '.',
    dockerfile='src/EntKube.Web/Dockerfile',
    live_update=[
        sync('src/EntKube.Web/', '/src/src/EntKube.Web/'),
        sync('src/EntKube.Web.Client/', '/src/src/EntKube.Web.Client/'),
        sync('src/EntKube.SharedKernel/', '/src/src/EntKube.SharedKernel/'),
        run('cd /src/src/EntKube.Web && dotnet build -c Release -o /app', trigger=['src/EntKube.Web/', 'src/EntKube.Web.Client/', 'src/EntKube.SharedKernel/']),
    ]
)

docker_build(
    'entkube/clusters',
    '.',
    dockerfile='src/EntKube.Clusters/Dockerfile',
    live_update=[
        sync('src/EntKube.Clusters/', '/src/src/EntKube.Clusters/'),
        sync('src/EntKube.SharedKernel/', '/src/src/EntKube.SharedKernel/'),
        run('cd /src/src/EntKube.Clusters && dotnet build -c Release -o /app', trigger=['src/EntKube.Clusters/', 'src/EntKube.SharedKernel/']),
    ]
)

docker_build(
    'entkube/identity',
    '.',
    dockerfile='src/EntKube.Identity/Dockerfile',
    live_update=[
        sync('src/EntKube.Identity/', '/src/src/EntKube.Identity/'),
        sync('src/EntKube.SharedKernel/', '/src/src/EntKube.SharedKernel/'),
        run('cd /src/src/EntKube.Identity && dotnet build -c Release -o /app', trigger=['src/EntKube.Identity/', 'src/EntKube.SharedKernel/']),
    ]
)

docker_build(
    'entkube/provisioning',
    '.',
    dockerfile='src/EntKube.Provisioning/Dockerfile',
    live_update=[
        sync('src/EntKube.Provisioning/', '/src/src/EntKube.Provisioning/'),
        sync('src/EntKube.SharedKernel/', '/src/src/EntKube.SharedKernel/'),
        run('cd /src/src/EntKube.Provisioning && dotnet build -c Release -o /app', trigger=['src/EntKube.Provisioning/', 'src/EntKube.SharedKernel/']),
    ]
)

docker_build(
    'entkube/secrets',
    '.',
    dockerfile='src/EntKube.Secrets/Dockerfile',
    live_update=[
        sync('src/EntKube.Secrets/', '/src/src/EntKube.Secrets/'),
        sync('src/EntKube.SharedKernel/', '/src/src/EntKube.SharedKernel/'),
        run('cd /src/src/EntKube.Secrets && dotnet build -c Release -o /app', trigger=['src/EntKube.Secrets/', 'src/EntKube.SharedKernel/']),
    ]
)

# Deploy via Helm chart with dev values
k8s_yaml(helm(
    'Charts/entkube',
    name='entkube',
    namespace='default',
    values=['Charts/entkube/values-dev.yaml'],
))

# Resource grouping for the Tilt UI
k8s_resource('entkube-web', port_forwards='5000:5000', labels=['entkube'])
k8s_resource('entkube-clusters', port_forwards='5010:5010', labels=['entkube'])
k8s_resource('entkube-provisioning', port_forwards='5020:5020', labels=['entkube'])
k8s_resource('entkube-identity', port_forwards='5030:5030', labels=['entkube'])
k8s_resource('entkube-secrets', port_forwards='5040:5040', labels=['entkube'])
