load('ext://restart_process', 'docker_build_with_restart')

secret_settings(disable_scrub=True)

if config.tilt_subcommand == "up":
    if not os.path.exists("vendor"):
        local(command="go mod vendor")

    local(command="cd dashboard; npm i --legacy-peer-deps")

if config.tilt_subcommand == "down":
    if os.path.exists("vendor"):
        local(command="rm -rf vendor")
    if os.path.exists("dashboard/node_modules"):
        local(command="rm -rf dashboard/node_modules")

build_args = "GOOS=linux GOARCH=arm64"
if os.getenv("PLATFORM") == "amd64":
    build_args = "GOOS=linux GOARCH=amd64"

allow_k8s_contexts('kind-porter')
cluster = str(local('kubectl config current-context')).strip()
if (cluster.startswith("kind-")):
    install = kustomize('zarf/helm', flags=["--enable-helm"])
    decoded = decode_yaml_stream(install)
    for d in decoded:
        if d.get('kind') == 'Deployment':
            if "securityContext" in d['spec']['template']['spec']:
                d['spec']['template']['spec'].pop('securityContext')
            for c in d['spec']['template']['spec']['containers']:
                if "securityContext" in c:
                    c.pop('securityContext')

    updated_install = encode_yaml_stream(decoded)

    k8s_yaml(updated_install)
else:
    local("echo 'Be careful that you aren't connected to a staging or prod cluster' && exit 1")
    exit()

ngrok_url = os.getenv("NGROK_URL")
if ngrok_url == "":
    local("echo 'NGROK_URL env variable is required but not set' && exit 1")
    exit()

k8s_resource(
    workload='porter-server-web',
    port_forwards=["8080:8080"],
    labels=["porter"],
    resource_deps=["porter-binary"],
)

k8s_resource(
    workload='porter-auth-web',
    port_forwards=["8090:8090"],
    labels=["porter"],
    resource_deps=["porter-binary"],
)

watch_file('zarf/helm/.server.env')
watch_file('zarf/helm/.dashboard.env')

## Build binary locally for faster devexp
local_resource(
  name='porter-binary',
  cmd='''GOWORK=off CGO_ENABLED=0 %s go build -mod vendor -gcflags '-N -l' -tags ee -o ./bin/porter ./cmd/app/main.go''' % build_args,
  deps=[
    "api",
    "build",
    "ee",
    "internal",
    "pkg",
    "vendor",
    "cmd",
  ],
  resource_deps=["postgresql"],
  labels=["z_binaries"]
)

local_resource(
    name="migrations-binary",
    cmd='''GOWORK=off CGO_ENABLED=0 %s go build -mod vendor -gcflags '-N -l' -tags ee -o ./bin/migrate ./cmd/migrate/main.go ./cmd/migrate/migrate_ee.go''' % build_args,
    resource_deps=["postgresql"],
    labels=["z_binaries"],
)

local_resource(
    name="disable-porter-helm-test",
    cmd='tilt disable porter-server-web-test-connection',
    resource_deps=["porter-server-web"]
)
local_resource(
    name="disable-auth-helm-test",
    cmd='tilt disable porter-auth-web-test-connection',
    resource_deps=["porter-auth-web"]
)

docker_build_with_restart(
    ref="porter1/porter-server",
    context=".",
    dockerfile="zarf/docker/Dockerfile.server.tilt",
    entrypoint='/app/migrate && /app/porter',
    build_args={},
    only=[
        "bin",
    ],
    live_update=[
        sync('./bin/porter', '/app/'),
        sync('./bin/migrate', '/app/'),
    ]
)

docker_build_with_restart(
    ref="porter1/porter-auth",
    context=".",
    dockerfile="zarf/docker/Dockerfile.server.tilt",
    entrypoint='/app/porter --auth',
    build_args={},
    only=[
        "bin",
    ],
    live_update=[
        sync('./bin/porter', '/app/'),
    ]
)

local_resource(
  name='reload-server-config',
  cmd='kubectl rollout restart deployment porter-server-web',
  deps=[
    "zarf/helm/.server.env"
  ],
  labels=["porter"],
  resource_deps=["porter-server-web"]
)

# Frontend
local_resource(
    name="porter-dashboard",
    serve_cmd="npm start",
    serve_dir="dashboard",
    serve_env={
        "ENV_FILE": "../zarf/helm/.dashboard.env",
        "NODE_OPTIONS":"--openssl-legacy-provider"
    },
    deps=[
      "dashboard/package.json",
    ],
    resource_deps=["postgresql"],
    labels=["porter"]
)
local_resource('public-url', 
serve_cmd='''
echo " \n\n****** NGROK URL ****** \n\n" && echo https://%s && echo "\n\n********\n\n" && ngrok http 8081 --log=stdout --domain=%s''' 
% (ngrok_url, ngrok_url), resource_deps=["porter-dashboard"], labels=["porter"])
