package eu.dnetlib.espas.api.csw;

import eu.dnetlib.espas.api.exception.OwsException;
import eu.dnetlib.espas.api.exception.OwsExceptionCode;
import eu.dnetlib.espas.api.csw.iterator.ResourceIterator;

import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.*;

public class CSWService {
    private Csw csw;

    void getRecord(PrintWriter pw, String id) {
        pw.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        pw.println("<GetRecordsResponse>");
        pw.print("<id>" + id + "</id>");
        pw.println("</GetRecordsResponse>");
    }

    void getRecords(PrintWriter pw, String constraintLanguage, String constraint, int startPosition, int maxRecords, String requestId) throws OwsException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
        ResourceIterator iterator = csw.getResourceIterator(constraint);

        if (iterator == null)
            throw new OwsException("Parameter 'constraint' is not valid. Check the resource type.", "CSW", OwsExceptionCode.INVALID_PARAMETER);

        List<String> records = (List<String>) iterator.getResources(startPosition - 1, maxRecords);

        pw.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        pw.print("<csw:GetRecordsResponse ");
        pw.print("xmlns:csw=\"http://www.opengis.net/cat/csw/2.0.2\" ");
        pw.print("xmlns:dc=\"http://purl.org/dc/elements/1.1/\" ");
        pw.print("xmlns:dct=\"http://purl.org/dc/terms/\" ");
        pw.print("xmlns:ows=\"http://www.opengis.net/ows\" ");
        pw.print("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ");
        pw.print("xmlns:espas=\"http://schemas.espas-fp7.eu\" >");
        pw.print("<csw:SearchStatus timestamp=\"" + sdf.format(new java.util.Date()) + "\"/>");
        pw.print("<csw:SearchResults numberOfRecordsMatched=\"" + iterator.getTotalResourceCount());
        pw.print("\" numberOfRecordsReturned=\"" + records.size());
        pw.print("\" nextRecord=\"" + getNextRecord(iterator.getTotalResourceCount(), startPosition, maxRecords) + "\"");
        if (requestId != null && !requestId.equals("default"))
            pw.print(" requestId=\"" + requestId + "\"");
        pw.println(">");

        /////////////////////
        /////////////////////
        /////////////////////
        for (String record : records) {
            pw.println(record);
        }
        /////////////////////
        /////////////////////
        /////////////////////

        pw.println("</csw:SearchResults>");
        pw.println("</csw:GetRecordsResponse>");
    }

    public Csw getCsw() {
        return csw;
    }

    public void setCsw(Csw csw) {
        this.csw = csw;
    }

    private int getNextRecord(int resourceCount, int startPosition, int maxRecords) {
        int next = (maxRecords + startPosition);

        return (next <= resourceCount) ? next : 0;
    }
}