package buildjob;

import static com.atlassian.bamboo.specs.builders.task.TestParserTask.createJUnitParserTask;

import java.time.LocalTime;

import com.atlassian.bamboo.specs.api.BambooSpec;
import com.atlassian.bamboo.specs.api.builders.BambooKey;
import com.atlassian.bamboo.specs.api.builders.docker.DockerConfiguration;
import com.atlassian.bamboo.specs.api.builders.permission.PermissionType;
import com.atlassian.bamboo.specs.api.builders.permission.Permissions;
import com.atlassian.bamboo.specs.api.builders.permission.PlanPermissions;
import com.atlassian.bamboo.specs.api.builders.plan.Job;
import com.atlassian.bamboo.specs.api.builders.plan.Plan;
import com.atlassian.bamboo.specs.api.builders.plan.PlanIdentifier;
import com.atlassian.bamboo.specs.api.builders.plan.Stage;
import com.atlassian.bamboo.specs.api.builders.plan.branches.BranchCleanup;
import com.atlassian.bamboo.specs.api.builders.plan.branches.PlanBranchManagement;
import com.atlassian.bamboo.specs.api.builders.project.Project;
import com.atlassian.bamboo.specs.builders.task.CheckoutItem;
import com.atlassian.bamboo.specs.builders.task.InjectVariablesTask;
import com.atlassian.bamboo.specs.builders.task.ScriptTask;
import com.atlassian.bamboo.specs.builders.task.VcsCheckoutTask;
import com.atlassian.bamboo.specs.builders.task.CleanWorkingDirectoryTask;
import com.atlassian.bamboo.specs.builders.task.VcsTagTask;
import com.atlassian.bamboo.specs.builders.trigger.BitbucketServerTrigger;
import com.atlassian.bamboo.specs.builders.trigger.ScheduledTrigger;
import com.atlassian.bamboo.specs.model.task.InjectVariablesScope;
import com.atlassian.bamboo.specs.api.builders.Variable;
import com.atlassian.bamboo.specs.util.BambooServer;
import com.atlassian.bamboo.specs.builders.task.ScriptTask;
import com.atlassian.bamboo.specs.model.task.ScriptTaskProperties.Location;

/**
 * Plan configuration for Bamboo.
 * Learn more on: <a href="https://confluence.atlassian.com/display/BAMBOO/Bamboo+Specs">https://confluence.atlassian.com/display/BAMBOO/Bamboo+Specs</a>
 */
@BambooSpec
public class PlanSpec {

    private static final String SERVICE_NAME = "cv-analysis";

    private static final String SERVICE_KEY = SERVICE_NAME.toUpperCase().replaceAll("-","").replaceAll("_","");

    /**
     * Run main to publish plan on Bamboo
     */
    public static void main(final String[] args) throws Exception {
        //By default credentials are read from the '.credentials' file.
        BambooServer bambooServer = new BambooServer("http://localhost:8085");

        Plan plan = new PlanSpec().createDockerBuildPlan();
        bambooServer.publish(plan);
        PlanPermissions planPermission = new PlanSpec().createPlanPermission(plan.getIdentifier());
        bambooServer.publish(planPermission);

        Plan secPlan = new PlanSpec().createSecBuild();
        bambooServer.publish(secPlan);
        PlanPermissions secPlanPermission = new PlanSpec().createPlanPermission(secPlan.getIdentifier());
        bambooServer.publish(secPlanPermission);
    }

    private PlanPermissions createPlanPermission(PlanIdentifier planIdentifier) {
        Permissions permission = new Permissions()
                .userPermissions("atlbamboo", PermissionType.EDIT, PermissionType.VIEW, PermissionType.ADMIN, PermissionType.CLONE, PermissionType.BUILD)
                .groupPermissions("research", PermissionType.EDIT, PermissionType.VIEW, PermissionType.CLONE, PermissionType.BUILD)
                .groupPermissions("Development", PermissionType.EDIT, PermissionType.VIEW, PermissionType.CLONE, PermissionType.BUILD)
                .groupPermissions("QA", PermissionType.EDIT, PermissionType.VIEW, PermissionType.CLONE, PermissionType.BUILD)
                .loggedInUserPermissions(PermissionType.VIEW)
                .anonymousUserPermissionView();
        return new PlanPermissions(planIdentifier.getProjectKey(), planIdentifier.getPlanKey()).permissions(permission);
    }

    private Project project() {
        return new Project()
                .name("RED")
                .key(new BambooKey("RED"));
    }

    public Plan createDockerBuildPlan() {
    return new Plan(
            project(),
            SERVICE_NAME, new BambooKey(SERVICE_KEY))
//             .description("Docker build for cv-analysis.")
            // .variables()
            .stages(new Stage("Build Stage")
              .jobs(
                new Job("Build Job", new BambooKey("BUILD"))
                  .tasks(
                    new CleanWorkingDirectoryTask()
                        .description("Clean working directory.")
                        .enabled(true),
                    new VcsCheckoutTask()
                        .description("Checkout default repository.")
                        .checkoutItems(new CheckoutItem().defaultRepository()),
                    new ScriptTask()
                        .description("Set config and keys.")
                        .location(Location.FILE)
                        .fileFromPath("bamboo-specs/src/main/resources/scripts/key-prepare.sh"),
                    new ScriptTask()
                        .description("Build Docker container.")
                        .location(Location.FILE)
                        .fileFromPath("bamboo-specs/src/main/resources/scripts/docker-build.sh")
                        .argument(SERVICE_NAME),
                    new InjectVariablesTask()
                        .description("Inject git tag.")
                        .path("git.tag")
                        .namespace("g")
                        .scope(InjectVariablesScope.LOCAL),
                    new VcsTagTask()
                        .description("${bamboo.g.gitTag}")
                        .tagName("${bamboo.g.gitTag}")
                        .defaultRepository())
                .dockerConfiguration(
                    new DockerConfiguration()
                        .image("nexus.iqser.com:5001/infra/release_build:4.5.0")
                        .volume("/var/run/docker.sock", "/var/run/docker.sock")),
                new Job("Licence Job", new BambooKey("LICENCE"))
                  .enabled(false)
                  .tasks(
                    new VcsCheckoutTask()
                        .description("Checkout default repository.")
                        .checkoutItems(new CheckoutItem().defaultRepository()),
                    new ScriptTask()
                        .description("Build licence.")
                        .location(Location.FILE)
                        .fileFromPath("bamboo-specs/src/main/resources/scripts/create-licence.sh"))
                  .dockerConfiguration(
                    new DockerConfiguration()
                        .image("nexus.iqser.com:5001/infra/maven:3.6.2-jdk-13-3.0.0")
                        .volume("/etc/maven/settings.xml", "/usr/share/maven/ref/settings.xml")
                        .volume("/var/run/docker.sock", "/var/run/docker.sock"))))
            .linkedRepositories("RR / " + SERVICE_NAME)
            .triggers(
                    new BitbucketServerTrigger())
            .planBranchManagement(
                new PlanBranchManagement()
                    .createForVcsBranch()
                    .delete(
                        new BranchCleanup()
                            .whenInactiveInRepositoryAfterDays(14))
                    .notificationForCommitters());
    }

    public Plan createSecBuild() {
        return new Plan(project(), SERVICE_NAME + "-Sec", new BambooKey(SERVICE_KEY + "SEC")).description("Security Analysis Plan")
                .stages(new Stage("Default Stage").jobs(
                    new Job("Sonar Job", new BambooKey("SONAR"))
                      .tasks(
                        new CleanWorkingDirectoryTask()
                            .description("Clean working directory.")
                            .enabled(true),
                        new VcsCheckoutTask()
                            .description("Checkout default repository.")
                            .checkoutItems(new CheckoutItem().defaultRepository()),
                        new ScriptTask()
                            .description("Set config and keys.")
                            .location(Location.FILE)
                            .fileFromPath("bamboo-specs/src/main/resources/scripts/key-prepare.sh"),
                        new ScriptTask()
                            .description("Run Sonarqube scan.")
                            .location(Location.FILE)
                            .fileFromPath("bamboo-specs/src/main/resources/scripts/sonar-scan.sh")
                            .argument(SERVICE_NAME))
                      .dockerConfiguration(
                          new DockerConfiguration()
                            .image("nexus.iqser.com:5001/infra/release_build:4.2.0")
                            .volume("/var/run/docker.sock", "/var/run/docker.sock"))))
                .linkedRepositories("RR / " + SERVICE_NAME)
                .triggers(
                    new ScheduledTrigger()
                        .scheduleOnceDaily(LocalTime.of(23, 00)))
                .planBranchManagement(
                    new PlanBranchManagement()
                        .createForVcsBranchMatching("release.*")
                        .notificationForCommitters());
    }
}
