package com.pr.sepp.sep.build.model;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.offbytwo.jenkins.model.BuildChangeSet;
import com.offbytwo.jenkins.model.BuildChangeSetItem;
import com.offbytwo.jenkins.model.BuildWithDetails;
import com.pr.sepp.sep.build.model.constants.BuildType;
import com.pr.sepp.sep.build.model.constants.InstanceType;
import com.pr.sepp.sep.build.model.constants.JenkinsBuildStatus;
import com.pr.sepp.sep.build.model.req.BuildHistoryReq;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

import static com.pr.sepp.sep.build.model.constants.JenkinsBuildStatus.START;
import static com.pr.sepp.sep.build.model.constants.JenkinsBuildStatus.buildToBuildStatus;
import static java.util.stream.Collectors.toList;
import static org.apache.commons.lang3.StringUtils.EMPTY;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BuildHistory {
	private Integer id;
	private String jobName;
	private Integer noteId;
	private Integer productId;
	private Integer branchId;
	private Integer envType;
	private String instance;
	private Integer buildVersion;
	private String submitter;
	private String buildHost;
	private JenkinsBuildStatus buildStatus;
	private String buildParams;
	private Long buildInterval;
	private String codeChange;
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
	private String createdDate;
	private LocalDateTime updatedDate;
	private String tag;

	private Integer userId;
	private JenkinsStatus status;
	private String branchName;
	private String envName;
	private String pipelineStep;
	private BuildType buildType;

	private InstanceType type;

	public void setBuildStatus(JenkinsBuildStatus buildStatus) {
		this.buildStatus = buildStatus;
		this.status = JenkinsStatus.apply(buildStatus);
	}

	@Data
	@Builder
	public static class JenkinsStatus {
		private String color;
		@Builder.Default
		private Integer percentage = 100;
		private String badge;
		private String statusCh;

		public static JenkinsStatus apply(JenkinsBuildStatus status) {
			if (Objects.isNull(status)) return null;
			return JenkinsStatus.builder().badge(status.badge).color(status.color).statusCh(status.statusCh).build();
		}

		public void setPercentage(Integer percentage) {
			if (percentage == -1) {
				this.percentage = 90;
				return;
			}
			this.percentage = percentage;
		}
	}

	public static BuildHistory apply(Integer number, BuildWithDetails details, String jobName) {
		return BuildHistory.builder()
				.buildStatus(buildToBuildStatus(details))
				.buildVersion(number)
				.jobName(jobName)
				.codeChange(codeChange(details.getChangeSets()))
				.buildInterval(details.getDuration())
				.build();
	}

	public static BuildHistory reqToBuildHistory(BuildHistoryReq buildHistoryReq) {
		BuildHistory buildHistory = BuildHistory.builder().build();
		BeanUtils.copyProperties(buildHistoryReq, buildHistory);
		buildHistory.setBuildStatus(START);
		return buildHistory;
	}

	public static String codeChange(List<BuildChangeSet> changeSets) {
		if (changeSets != null) {
			List<String> msg = changeSets.stream()
					.flatMap(changeSet -> changeSet.getItems().stream().map(BuildChangeSetItem::getMsg))
					.collect(toList());
			return StringUtils.join(msg, "<br>");
		}
		return EMPTY;
	}

}