package com.mploed.spring.events.customer.web;

import com.mploed.spring.events.customer.domain.Customer;
import com.mploed.spring.events.customer.repository.CustomerRepository;

import com.rometools.rome.feed.atom.Content;
import com.rometools.rome.feed.atom.Entry;
import com.rometools.rome.feed.atom.Feed;
import com.rometools.rome.feed.atom.Link;
import com.rometools.rome.feed.atom.Person;
import com.rometools.rome.feed.synd.SyndPerson;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.view.feed.AbstractAtomFeedView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class CustomerAtomFeedView extends AbstractAtomFeedView {
	private CustomerRepository customerRepository;

	@Autowired
	public CustomerAtomFeedView(CustomerRepository customerRepository) {
		this.customerRepository = customerRepository;
	}

	@Override
	protected void buildFeedMetadata(Map<String, Object> model, Feed feed, HttpServletRequest request) {
		feed.setId("https://github.com/mploed/event-driven-spring-boot/customer");
		feed.setTitle("Customer");
		List<Link> alternateLinks = new ArrayList<>();
		Link link = new Link();
		link.setRel("self");
		link.setHref(baseUrl(request) + "feed");
		alternateLinks.add(link);
		List<SyndPerson> authors = new ArrayList<SyndPerson>();
		Person person = new Person();
		person.setName("Big Pug Bank");
		authors.add(person);
		feed.setAuthors(authors);

		feed.setAlternateLinks(alternateLinks);
		feed.setUpdated(customerRepository.lastUpdate());
		Content subtitle = new Content();
		subtitle.setValue("List of all customers");
		feed.setSubtitle(subtitle);
	}

	private String baseUrl(HttpServletRequest request) {
		return String.format("%s://%s:%d%s/", request.getScheme(), request.getServerName(), request.getServerPort(),
				request.getContextPath());
	}

	@Override
	protected List<Entry> buildFeedEntries(Map<String, Object> model, HttpServletRequest request,
	                                       HttpServletResponse response) throws Exception {

		List<Entry> entries = new ArrayList<Entry>();
		List<Customer> customerlist = (List<Customer>) model.get("customers");

		for (Customer o : customerlist) {
			Entry entry = new Entry();
			entry.setId("https://github.com/mploed/event-driven-spring-boot/customer/" + Long.toString(o.getId()));
			entry.setUpdated(o.getUpdated());
			entry.setTitle("Customer " + o.getId());
			List<Content> contents = new ArrayList<Content>();
			Content content = new Content();
			content.setSrc(baseUrl(request) + "customer/rest/" + Long.toString(o.getId()));
			content.setType("application/json");
			contents.add(content);
			entry.setContents(contents);
			Content summary = new Content();
			summary.setValue("This is the customer " + o.getId());
			entry.setSummary(summary);
			entries.add(entry);
		}

		return entries;
	}
}