class GetRepoConfigAction extends AbstractAction {

	@Override
	public boolean run() {
		// 前置条件，确保当前分支是 master 分支
		// 改为读取所有 tag 和 master 分支中的 blocklang 文件
		// 并校验其中的 repo 和 category 中的值是否相同
		// 如果不同，则给出错误信息
		
		// 1. 获取所有 tag 中的 blocklang.json 文件内容
		List<Pair<String, GitBlobInfo>> blocklangContents = readConfigFromTagsAndMasterBranch();
		if(blocklangContents.isEmpty()) {
			logger.error("在 git 仓库中没有找到 master 分支");
			return false;
		}

		List<Integer> errorCount = new ArrayList<Integer>();
		
		// 确保将所有文件的所有逻辑都校验一遍，即找出所有可能错误，而不是校验一种错误就退出。
		List<Pair<String, RepoConfigJson>> configs = blocklangContents.stream().map(pair -> {
			// 校验如果有分支中缺少 blocklang.json 文件，则给出错误信息
			if(pair.getValue() == null) {
				logger.info("{0} 中没有找到 {1} 文件", pair.getKey(), MarketplaceStore.BLOCKLANG_JSON);
				errorCount.add(1);
			}
			return pair;
		}).map(pair -> {
			Pair<String, RepoConfigJson> errorResult = Pair.of(pair.getKey(), null);
			if(pair.getValue() == null) {
				return errorResult;
			}
			
			logger.info("校验 {0} 文件格式", MarketplaceStore.BLOCKLANG_JSON);
			JsonNode jsonNode;
			try {
				jsonNode = JsonUtil.readTree(pair.getValue().getContent());
			} catch (JsonProcessingException e) {
				logger.error(e);
				errorCount.add(1);
				return errorResult;
			}
			
			// 先判断类型
			String repo = jsonNode.get("repo").asText();
			String category = jsonNode.get("category").asText();
			
			if(!validateRepoTypeAndCategory(repo, category)) {
				errorCount.add(1);
				return errorResult;
			}
			
			Set<ValidationMessage> errors = BlocklangJsonValidator.run(jsonNode);
			if(!errors.isEmpty()) {
				logger.error("{0} 格式有误，请按以下说明调整后再注册", configFileName);
				errors.forEach(error -> logger.error(error.getMessage()));
				errorCount.add(1);
				return errorResult;
			}
			
			try {
				RepoConfigJson repoConfigJson = JsonUtil.treeToValue(jsonNode, RepoConfigJson.class);
				return Pair.of(pair.getKey(), repoConfigJson);
			} catch (JsonProcessingException e) {
				logger.error(e);
				errorCount.add(1);
				return errorResult;
			}
			
		}).filter(pair -> pair.getValue() != null).collect(Collectors.toList());
		
		// 校验所有文件中的 repo 和 category 值是否相同
		if(configs.size() > 1) {
			RepoConfigJson firstConfig = configs.get(0).getValue();
			String repo = firstConfig.getRepo();
			String category = firstConfig.getCategory();
			
			for(var config : configs) {
				String curRepo = config.getValue().getRepo();
				if(!curRepo.equals(repo)) {
					logger.error("一经发布，repo 的值不允许改变，但 {0} 下的 repo 值却改为 {1}，应改回 {2}", config.getKey(), curRepo, repo);
					errorCount.add(1);
				}
				
				String curCategory = config.getValue().getCategory();
				if(!curCategory.equals(category)) {
					logger.error("一经发布，category 的值不允许改变，但 {0} 下的 category 值却改为 {1}，应改回 {2}", config.getKey(), curCategory, category);
					errorCount.add(1);
				}
			}
		}
		
		if(!errorCount.isEmpty()) {
			return false;
		}
		
		repoConfigJson = configs.get(configs.size() - 1).getValue();
		return true;
	}

	public  GetRepoConfigAction(ExecutionContext context);

}