print("""
-----------------------------------------------------------------
✨ Starting up Barretthousen stack
-----------------------------------------------------------------
""".strip())

load('ext://helm_resource', 'helm_resource', 'helm_repo')
load('ext://deployment', 'deployment_create')
load('ext://restart_process', 'docker_build_with_restart')

helm_repo('bitnami', 'https://charts.bitnami.com/bitnami', labels=["9-repos"])
helm_repo('traefik', 'https://traefik.github.io/charts', labels=["9-repos"])
helm_repo('grafana', 'https://grafana.github.io/helm-charts', labels=["9-repos"])


helm_resource(
    'ingress',
    'traefik/traefik',
    namespace='barretthousen-local',
    flags=[
        '--set', 'logs.access.enabled=true'
    ],
    port_forwards=[
        port_forward(8000, 8000, name='Barretthousen'),
        port_forward(9000, 9000, name='Traefik', link_path='/dashboard/#/')
    ],
    resource_deps=['traefik'],
    labels=["1-ingress"]
)

k8s_resource(
    workload='ingress',
    labels='1-ingress',
    links=[
        link(url='http://admin.localhost:8000', name='Admin Panel'),
    ]
)

helm_resource(
    'postgres',
    'bitnami/postgresql',
    namespace='barretthousen-local',
    flags=[
        '--set', 'fullnameOverride=bh-db',
        '--set', 'auth.enablePostgresUser=true',
        '--set', 'auth.postgresPassword=bh-admin',
        '--set', 'auth.database=bh',
    ],
    port_forwards=[
        port_forward(5432, 5432, name='BH DB')],
    resource_deps=['bitnami'],
    labels=["9-data"])

k8s_yaml(
    kustomize("./env/local")
)

def bh_backend_service(service="", port_forwards=[], migrateDB=False, devMode=True, labels=['2-services'], deps=['postgres']):
    local_resource(
        '{}-go-compile'.format(service),
        'CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -gcflags "all=-N -l" -o .bin/{}-debug ./src/{}'.format(service, service),
        deps=['./src/{}'.format(service), './src/lib'],
        resource_deps=deps,
        labels=['3-compilation']
    )

    entry_cmd = [
            '/go/bin/dlv',
            '--headless',
            '--listen=0.0.0.0:2345',
            '--api-version=2',
            '--log',
            '--accept-multiclient',
            '--log-output=rpc',
            'exec',
            '/opt/{}-debug'.format(service),
            '--continue'
        ]

    if migrateDB:
        entry_cmd += ['--', '-migrate']

    docker_build_with_restart(
        ref="barretthousen/service-{}".format(service),
        dockerfile="./src/Dockerfile.dev-backend",
        context=".",
        entrypoint=entry_cmd,
        build_args={
            "service": service
        },
        trigger = [
            './.bin/{}-debug'.format(service)
        ],
        only = [
            './.bin/{}-debug'.format(service),
            './src/runner',
            './src/catalog',
            './src/proxy-admin',
            './src/proxy-client',
            './src/lib'
        ],
        live_update=[
            sync('./.bin', '/opt'),
            sync('./src', '/go/src')
        ]
    )

    k8s_resource(
        workload='{}-local'.format(service),
        port_forwards=port_forwards,
        labels=labels,
        resource_deps=deps,
    )



bh_backend_service(service="runner", migrateDB=True, port_forwards=[
    port_forward(2345, name='Delve port')
])

bh_backend_service(service="catalog", migrateDB=True, port_forwards=[
    port_forward(2346, 2345, name='Delve port')
])

bh_backend_service(service="proxy-admin", port_forwards=[
    port_forward(8082, 80, name="HTTP API @ localhost:8082")
], deps=['ingress'])

bh_backend_service(service="proxy-client", port_forwards=[
    port_forward(8081, 80, name="HTTP API @ localhost:8081")
], deps=['ingress'])

docker_build(
    ref='barretthousen/service-web-client',
    context='./src/web-client',
    dockerfile='./src/web-client/Dockerfile.frontend',
    target='development'
)
k8s_resource(
    workload='web-client-local',
    port_forwards=['8080:80'],
    labels=['2-services'],
    resource_deps=['ingress']
)


k8s_resource(
    workload='runner-sync-local',
    labels='2-services'
)

# local_resource(
#     'web-client',
#     dir='./src/web-client',
#     cmd='npm i',
#     serve_dir='./src/web-client',
#     serve_cmd='npm run dev',
#     ignore=['./src/web-client/src'],
#     deps=[
#         './src/web-client/package.json',
#         './src/web-client/svelte.config.js',
#         './src/web-client/vite.config.ts'
#     ],
#     readiness_probe=probe(10, 2, 10, 1, 3, http_get=http_get_action(8080, 'localhost', 'http')),
#     links=[
#         link(url='http://localhost:8080', name='Web Client')
#     ],
#     labels=['2-services']
# )


# helm_resource(
#     'loki-stack',
#     'grafana/loki-stack',
#     resource_deps=['grafana'],
#     flags=[
#         '--set', 'fluent-bit.enabled=false',
#         '--set', 'promtail.enabled=false',
#         '--set', 'loki.enabled=false',
#     ],
#     port_forwards=["3000:80"],
#     labels=["9-monitoring"])
