# Tiltfile for working with Next and Strapi locally


# load('ext://cert_manager', 'deploy_cert_manager')
# deploy_cert_manager()
load('ext://dotenv', 'dotenv')
dotenv(fn='.env')

default_registry('localhost:5001')


# kubefwd all namespaces Tilt deploys to.
# v1alpha1.extension_repo(name='default', url='https://github.com/tilt-dev/tilt-extensions')
# v1alpha1.extension(name='kubefwd:config', repo_name='default', repo_path='kubefwd')

# v1alpha1.extension_repo(
#     name='default', 
#     url='https://github.com/tilt-dev/tilt-extensions'
# )
# v1alpha1.extension(
#   name='ngrok:config',
#   repo_name='default',
#   repo_path='ngrok',
# )

#   args=['--default_config_file=%s' % os.getenv('TILT_NGROK_DEFAULT_CONFIG_FILE')]
load('ext://helm_remote', 'helm_remote')

# helm_remote(
#     'redis',
#     repo_name='redis',
#     repo_url='https://charts.bitnami.com/bitnami',
#     namespace='futureporn',
#     version='19.5.2',
#     set=[
#         'auth.password=%s' % os.getenv('TRIGGER_REDIS_PASSWORD'),
#         'architecture=standalone',
#     ],
# )

helm_remote(
    'temporal',
    repo_name='temporal',
    repo_url='https://charts.lemontech.engineering',
    namespace='futureporn',
    version='0.37.0',
    set=[
        'admintools.image.tag=1.24.1-tctl-1.18.1-cli-0.12.0',
        'web.image.tag=2.27.2',
        'prometheus.enabled=false',
        'grafana.enabled=false',
        'elasticsearch.enabled=false',
        'web.config.auth.enabled=true',
        'cassandra.enabled=false',
        'server.config.persistence.default.driver=sql',
        'server.config.persistence.default.sql.driver=postgres12',
        'server.config.persistence.default.sql.host=%s' % os.getenv('POSTGRES_HOST'),
        'server.config.persistence.default.sql.port=5432',
        'server.config.persistence.default.sql.user=%s' % os.getenv('POSTGRES_USER'),
        'server.config.persistence.default.sql.password=%s' % os.getenv('POSTGRES_PASSWORD'),
        'server.config.persistence.visibility.driver=sql',
        'server.config.persistence.visibility.sql.driver=postgres12',
        'server.config.persistence.visibility.sql.host=%s' % os.getenv('POSTGRES_HOST'),
        'server.config.persistence.visibility.sql.port=5432',
        'server.config.persistence.visibility.sql.user=%s' % os.getenv('POSTGRES_USER'),
        'server.config.persistence.visibility.sql.password=%s' % os.getenv('POSTGRES_PASSWORD'),
    ]
)

# helm_remote(
#     'nitter',
#     repo_name='truecharts',
#     repo_url='https://charts.truecharts.org',
#     namespace='futureporn',
#     version='7.1.4',
# )
# helm_remote(
#     'frp-operator',
#     repo_name='frp-operator',
#     repo_url='https://zufardhiyaulhaq.com/frp-operator/charts/releases/',
#     namespace='futureporn',
#     version='1.0.0'
# )
# helm_remote(
#     'kubernetes-ingress-controller',
#     repo_name='kubernetes-ingress-controller',
#     repo_url='https://ngrok.github.io/kubernetes-ingress-controller',
#     namespace='futureporn',
#     create_namespace='false',
#     set=[
#         'credentials.apiKey=%s' % os.getenv('NGROK_API_KEY'),
#         'credentials.authtoken=%s' % os.getenv('NGROK_AUTHTOKEN')
#     ]
# )


# k8s_yaml(helm(
#     './charts/nitter',
#     values=['./charts/nitter/values.yaml'],
# ))

k8s_yaml(helm(
    './charts/fp',
    values=['./charts/fp/values-dev.yaml'],
))
# k8s_yaml(helm(
#     './charts/trigger',
#     set=[
#         'trigger.name=trigger',
#         'trigger.replicaCount=2',
#         'trigger.image.tag=self-host-rc.2',
#         'trigger.image.pullPolicy=IfNotPresent',
#         'trigger.env.ENCRYPTION_KEY=%s' % os.getenv('TRIGGER_ENCRYPTION_KEY'),
#         'trigger.env.MAGIC_LINK_SECRET=%s' % os.getenv('TRIGGER_MAGIC_LINK_SECRET'),
#         'trigger.env.DATABASE_URL=%s' % os.getenv('TRIGGER_DATABASE_URL'),
#         'trigger.env.LOGIN_ORIGIN=%s' % os.getenv('TRIGGER_LOGIN_ORIGIN'),
#         'trigger.env.APP_ORIGIN=%s' % os.getenv('TRIGGER_APP_ORIGIN'),
#         'trigger.env.PORT=%s' % os.getenv('TRIGGER_PORT'),
#         'trigger.env.REMIX_APP_PORT=%s' % os.getenv('TRIGGER_REMIX_APP_PORT'),
#         'trigger.env.REDIS_HOST=redis-master.futureporn.svc.cluster.local',
#         'trigger.env.REDIS_PORT=6379',
#         'trigger.ingress.nginx.enabled=false',
#         'trigger.ingress.enabled=false',
#         'postgres.enabled=false'
#     ]
# ))
# k8s_resource(
#     workload='trigger',
#     port_forwards=['3030'],
# )



# docker_build('fp/link2cid', './packages/link2cid')
docker_build(
    'fp/strapi',
    '.',
    build_args={
        'NODE_ENV': 'development',
    },
    only=['./packages/strapi'],
    dockerfile='./d.strapi.dockerfile',
    live_update=[
        sync('./packages/strapi', '/app')
    ]
)


# docker_build(
#     'fp/strapi-app',
#     '.',
#     only=["./packages/strapi-app"],
#     dockerfile='d.strapi-app.dockerfile',
#     live_update=[
#         sync('./packages/strapi-app', '/app')
#     ]
# )

load('ext://uibutton', 'cmd_button')
cmd_button('postgres:create',
    argv=['sh', './scripts/postgres-create.sh'],
    resource='postgres',
    icon_name='dataset',
    text='create (empty) databases',
)
cmd_button('postgres:restore',
    argv=['sh', './scripts/postgres-restore.sh'],
    resource='postgres',
    icon_name='upload',
    text='restore db from backup',
)
cmd_button('postgres:drop',
    argv=['sh', './scripts/postgres-drop.sh'],
    resource='postgres',
    icon_name='delete',
    text='DROP futureporn_db'
)
cmd_button('postgres:drop_temporal',
    argv=['sh', './scripts/postgres-drop-temporal.sh'],
    resource='postgres',
    icon_name='delete',
    text='DROP temporal'
)
cmd_button('postgres:backup',
    argv=['sh', './scripts/postgres-backup.sh'],
    resource='postgres',
    icon_name='download',
    text='backup the database'
)
cmd_button('temporal-web:namespace',
    argv=['sh', './scripts/temporal-namespaces.sh'],
    resource='temporal-web',
    icon_name='badge',
    text='create futureporn namespace',
)


## Uncomment the following for fp/next in dev mode
## this is useful for changing the UI and seeing results
docker_build(
    'fp/next',
    '.',
    only=['./pnpm-lock.yaml', './package.json', './packages/next'],
    dockerfile='d.next.dockerfile',
    target='dev',
    build_args={
        'NEXT_PUBLIC_STRAPI_URL': 'https://strapi.piko.sbtp.xyz'
    },
    live_update=[
        sync('./packages/next', '/app')
    ]
)


docker_build(
    'fp/scout-manager',
    '.',
    only=['./pnpm-lock.yaml', './package.json', './packages/scout', './packages/next'],
    dockerfile='d.scout.dockerfile',
    target='manager',
    live_update=[
        sync('./packages/scout', '/app'),
        run('cd /app && pnpm i', trigger=['./packages/scout/package.json', './packages/scout/pnpm-lock.yaml']),
    ],
    entrypoint='pnpm nodemon --ext js,ts,json,yaml --exec node --no-warnings=ExperimentalWarning --loader ts-node/esm ./src/index.ts'
    # entrypoint='pnpm tsx watch ./src/index.ts'
)

docker_build(
    'fp/scout-worker',
    '.',
    only=['./pnpm-lock.yaml', './package.json', './packages/scout', './packages/next'],
    # ignore=['./packages/next'], # I wish I could use this ignore to ignore file changes in this dir, but that's not how it works
    dockerfile='d.scout.dockerfile',
    target='worker',
    live_update=[
        # idk if this run() is effective
        # run('cd /app && pnpm i', trigger=['./packages/scout/package.json', './packages/scout/pnpm-lock.yaml']),
        sync('./packages/scout', '/app'),
        ## this is a hack to avoid complete scout image rebuilds when src in ./packages/next is updated
        ## ./packages/next needs to be in the build context because scout depends on types exported from next module (a feature of pnpm workspaces)
        ## instead of a full rebuild, we put ./packages/next in the live_update spec so the changed files get shoved into /ignore-me
        ## ideally, I would like to include ./packages/next in the build context, but ignore file changes there for rebuilds.
        ## however, I don't think tilt has this capability.
        sync('./packages/next', '/ignore-me'),
    ],
    # this entrypoint is a godsend. It lets me restart the node app (fast) without having to rebuild the docker container (slow)
    entrypoint='pnpm nodemon --ext js,ts,json,yaml --exec node --no-warnings=ExperimentalWarning --loader ts-node/esm ./src/temporal/worker.ts'
)
# k8s_resource(
#     workload='kubernetes-ingress-controller-manager',
#     links=[
#       link(os.getenv('NGROK_URL'), 'Endpoint')
#     ],
#     labels='ngrok'
# )
# k8s_resource(
#     workload='frp-operator-controller-manager',
#     labels='tunnel'
# )
# k8s_resource(
#     workload='echo-deployment',
#     port_forwards=['8080'],
#     links=[
#         link('https://echo.piko.sbtp.xyz'),
#         link('http://echo.futureporn.svc.cluster.local:8080')
#     ],
#     labels='debug'
# )
# k8s_resource(
#     workload='snake',
#     port_forwards=['8080'],
#     labels='debug'
# )
# k8s_resource(
#     workload='game-2048',
#     port_forwards=['8081:8080'],
#     labels='debug'
# )

k8s_resource(
    workload='next',
    port_forwards=['3000'],
    links=[
        link('https://next.piko.sbtp.xyz'),
    ],
    resource_deps=['strapi', 'postgres']
)
k8s_resource(
    workload='strapi',
    port_forwards=['1339'],
    links=[
        link('http://localhost:1339/admin'),
        link('https://strapi.piko.sbtp.xyz'),
    ],
    resource_deps=['postgres']
)
# k8s_resource(
#     workload='strapi-app',
#     port_forwards=['1338']
# )

k8s_resource(
    workload='postgres',
    port_forwards=['5432']
)

k8s_resource(
    workload='scout-worker',
    resource_deps=['postgres', 'strapi', 'temporal-frontend', 'scout-manager']
)

k8s_resource(
    workload='scout-manager',
    resource_deps=['postgres', 'strapi', 'temporal-frontend']
)

# k8s_resource(
#     workload='pgadmin',
#     port_forwards=['5050'],
#     resource_deps=['postgres']
# )

# k8s_resource(
#     workload='nitter',
#     port_forwards=['6060:10606'],
# )



k8s_resource(workload='temporal-admintools', labels='temporal', resource_deps=['postgres'])
k8s_resource(workload='temporal-frontend', labels='temporal', port_forwards=['7233'], resource_deps=['postgres'])
k8s_resource(workload='temporal-history', labels='temporal', resource_deps=['postgres'])
k8s_resource(workload='temporal-worker', labels='temporal', resource_deps=['postgres'])
k8s_resource(workload='temporal-web', labels='temporal', port_forwards=['8080'], resource_deps=['postgres'])
k8s_resource(workload='temporal-schema-setup', labels='temporal', resource_deps=['postgres'])
k8s_resource(workload='temporal-schema-update', labels='temporal', resource_deps=['postgres'])
k8s_resource(workload='temporal-matching', labels='temporal', resource_deps=['postgres'])