/*
 * Copyright 2011 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitblit.models;

import java.io.Serializable;
import java.util.Date;
import java.util.Map;

import com.gitblit.Constants.FederationToken;

/**
 * Represents a proposal from a Gitblit instance to pull its repositories.
 */
public class FederationProposal implements Serializable {

	private static final long serialVersionUID = 1L;

	public Date received;

	public String name;

	public String url;

	public FederationToken tokenType;

	public String token;

	public String message;

	public Map<String, RepositoryModel> repositories;

	/**
	 * The constructor for a federation proposal.
	 *
	 * @param url
	 *            the url of the source Gitblit instance
	 * @param tokenType
	 *            the type of token from the source Gitblit instance
	 * @param token
	 *            the federation token from the source Gitblit instance
	 * @param repositories
	 *            the map of repositories to be pulled from the source Gitblit
	 *            instance keyed by the repository clone url
	 */
	public FederationProposal(String url, FederationToken tokenType, String token,
			Map<String, RepositoryModel> repositories) {
		this.received = new Date();
		this.url = url;
		this.tokenType = tokenType;
		this.token = token;
		this.message = "";
		this.repositories = repositories;
		try {
			// determine server name and set that as the proposal name
			name = url.substring(url.indexOf("//") + 2);
			if (name.contains("/")) {
				name = name.substring(0, name.indexOf('/'));
			}
			name = name.replace(".", "").replace(";", "").replace(":", "").replace("-", "");
		} catch (Exception e) {
			name = Long.toHexString(System.currentTimeMillis());
		}
	}

	@Override
	public String toString() {
		return "Federation Proposal (" + url + ")";
	}
}
