<?php

namespace App\Actions\Proxy;

use App\Enums\ActivityTypes;
use App\Enums\ProxyTypes;
use App\Models\Server;
use Illuminate\Support\Collection;
use Spatie\Activitylog\Models\Activity;
use Illuminate\Support\Str;

class InstallProxy
{
    public Collection $networks;

    public function __invoke(Server $server): Activity
    {
        $proxy_path = config('coolify.proxy_config_path');

        $networks = collect($server->standaloneDockers)->map(function ($docker) {
            return $docker['network'];
        })->unique();
        if ($networks->count() === 0) {
            $this->networks = collect(['coolify']);
        }
        $create_networks_command = $this->networks->map(function ($network) {
            return "docker network ls --format '{{.Name}}' | grep '^$network$' >/dev/null 2>&1 || docker network create --attachable $network > /dev/null 2>&1";
        });

        $configuration = instantRemoteProcess([
            "cat $proxy_path/docker-compose.yml",
        ], $server, false);
        if (is_null($configuration)) {
            $configuration = Str::of(getProxyConfiguration($server))->trim();
        } else {
            $configuration = Str::of($configuration)->trim();
        }
        $docker_compose_yml_base64 = base64_encode($configuration);
        $server->extra_attributes->last_applied_proxy_settings = Str::of($docker_compose_yml_base64)->pipe('md5')->value;
        $server->save();

        $env_file_base64 = base64_encode(
            $this->getEnvContents()
        );
        $activity = remoteProcess([
            ...$create_networks_command,
            "echo 'Docker networks created...'",
            "mkdir -p $proxy_path",
            "cd $proxy_path",
            "echo '$docker_compose_yml_base64' | base64 -d > $proxy_path/docker-compose.yml",
            "echo '$env_file_base64' | base64 -d > $proxy_path/.env",
            "echo 'Docker compose file created...'",
            "echo 'Pulling docker image...'",
            'docker compose pull -q',
            "echo 'Stopping proxy...'",
            'docker compose down -v --remove-orphans',
            "echo 'Starting proxy...'",
            'docker compose up -d --remove-orphans',
            "echo 'Proxy installed successfully...'"
        ], $server, ActivityTypes::INLINE->value);

        return $activity;
    }

    protected function getEnvContents()
    {
        $data = [
            'TRAEFIK_DASHBOARD_HOST' => '',
            'LETS_ENCRYPT_EMAIL' => '',
        ];

        return collect($data)
            ->map(fn ($v, $k) => "{$k}={$v}")
            ->push(PHP_EOL)
            ->implode(PHP_EOL);
    }
}