<?php

namespace Deployer;

require 'recipe/common.php';

inventory('deploy/hosts.yml');

// Project name
set('application', 'jagav2-phalcon');

$personal_access_token = getenv('PERSONAL_ACCESS_TOKEN');
set('repository', "https://gitlab-ci-token:$personal_access_token@dev.kpk.go.id/gitlab/JAGA/jaga-phalcon.git");

// Shared files/dirs between deploys
set('shared_files', [
    '.env',
    'app.ini',
    'public/.htaccess',
    'app/tools/apple_private_key.pem',
    'docker/dev/.env',
    'ssl/certs/server.crt',
    'ssl/private/server.key'
]);
set('shared_dirs', ['.phalcon', 'vendor', 'apache2_logs', 'logs', 'sites-available', 'conf-available', 'sites']);

// Writable dirs by web server
set('writable_dirs', ['public/files/', 'public/cache/']);
set('allow_anonymous_stats', false);

// Move folder from previous to new releases
set('copy_dirs', ['public/files']);

set('current_rel_dir', '{{deploy_path}}/current');

set('docker_composer_install_cmd', '"cd jaga_phalcon && composer install"');

task('deploy:vendors', function () {
    if (get('use_docker', false)) {
        run("cd {{release_path}} && docker compose -f docker/dev/docker-compose.yml exec jaga_phalcon_dev sh -c {{docker_composer_install_cmd}}");
    } else {
        run("cd {{release_path}} && composer install");
    }
});

task('deploy:finishing', function () {
    if (get('use_docker', false)) {
        run("cd {{current_rel_dir}} && docker compose -f docker/dev/docker-compose.yml exec jaga_phalcon_dev sh -c {{docker_composer_install_cmd}}");
        run('if [ ! -d logs ]; then mkdir logs; fi');
        set('phalcon_install_cmd', '"cd jaga_phalcon && ./vendor/phalcon/devtools/phalcon.sh"');
        if (get('run_migration', false)) {
            set('migration_cmd', '"cd jaga_phalcon && ./vendor/phalcon/devtools/phalcon migration run"');
            run(". ~/.bash_profile && cd {{current_rel_dir}} && docker compose -f docker/dev/docker-compose.yml exec jaga_phalcon_dev sh -c {{phalcon_install_cmd}} && docker compose -f docker/dev/docker-compose.yml exec jaga_phalcon_dev sh -c {{migration_cmd}}");
        }
    } else {
        run("cd {{current_rel_dir}} && composer install");
        run('if [ ! -d logs ]; then mkdir logs; fi');
        run("source ~/.bash_profile && cd {{current_rel_dir}} && ./vendor/phalcon/devtools/phalcon.sh migration run");
    }
});

task('docker:up', function () {
    if (get('use_docker', false)) {
        $stage = get('stage');
        if ($stage === 'staging_new') {
            run("cd {{release_path}} && docker compose -f docker/dev/docker-compose.yml up -d --remove-orphans");
        } else if ($stage === 'production_new') {
            run("cd {{release_path}} && docker compose -f docker/dev/docker-compose.yml up -d --remove-orphans jaga_phalcon_dev");
        }
    }
});

task('deploy:restart_services', function () {
    $isUseDocker = get('use_docker', false);
    if ($isUseDocker) {
        run(". ~/.bash_profile && cd {{current_rel_dir}} && docker compose -f docker/dev/docker-compose.yml restart");
    } else {
        run('sudo systemctl restart httpd');
        run('sudo systemctl restart php-fpm');
    }
});

// Tasks

desc('Deploy to stagging');
task('deploy', [
    'deploy:info',
    'deploy:prepare',
    'deploy:lock',
    'deploy:release',
    'deploy:update_code',
    'deploy:shared',
    'deploy:writable',
    'deploy:vendors',
    'deploy:clear_paths',
    'deploy:symlink',
    'deploy:copy_dirs',
    'deploy:unlock',
    'deploy:finishing',
    'deploy:restart_services',
    'cleanup',
    'success'
]);

before('deploy:vendors', 'docker:up');
// [Optional] If deploy fails automatically unlock.
after('deploy:failed', 'deploy:unlock');
