package com.ewolff.microservice.order.logic;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

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;

public class OrderAtomFeedView extends AbstractAtomFeedView {

	private OrderRepository orderRepository;

	@Autowired
	public OrderAtomFeedView(OrderRepository orderRepository) {
		super();
		this.orderRepository = orderRepository;
	}

	@Override
	protected void buildFeedMetadata(Map<String, Object> model, Feed feed, HttpServletRequest request) {
		feed.setId("tag:ewolff.com/microservice-atom/order");
		feed.setTitle("Order");
		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 Money Online Commerce Inc.");
		authors.add(person);
		feed.setAuthors(authors);

		feed.setAlternateLinks(alternateLinks);
		feed.setUpdated(orderRepository.lastUpdate());
		Content subtitle = new Content();
		subtitle.setValue("List of all orders");
		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<Order> orderlist = (List<Order>) model.get("orders");

		for (Order o : orderlist) {
			Entry entry = new Entry();
			entry.setId("tag:ewolff.com/microservice-atom/order/" + Long.toString(o.getId()));
			entry.setUpdated(o.getUpdated());
			entry.setTitle("Order " + o.getId());
			List<Content> contents = new ArrayList<Content>();
			Content content = new Content();
			content.setSrc(baseUrl(request) + "order/" + Long.toString(o.getId()));
			content.setType("application/json");
			contents.add(content);
			entry.setContents(contents);
			Content summary = new Content();
			summary.setValue("This is the order " + o.getId());
			entry.setSummary(summary);
			entries.add(entry);
		}

		return entries;
	}

}