/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.rya.indexing.geotemporal.model;

import static java.util.Objects.requireNonNull;

import java.util.Objects;
import java.util.Optional;

import org.apache.rya.api.domain.RyaIRI;
import org.apache.rya.indexing.TemporalInstant;
import org.apache.rya.indexing.TemporalInterval;
import org.apache.rya.indexing.geotemporal.GeoTemporalIndexer;

import com.vividsolutions.jts.geom.Geometry;

import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
import edu.umd.cs.findbugs.annotations.NonNull;

/**
 * Query object for a {@link GeoTemporalIndexer}.
 * Defines a {@link Geometry}, either a {@link TemporalInstant} or
 * {@link TemporalInterval}, and a triple Subject.
 */
public class Event {
    private final Optional<Geometry> geometry;
    private final Optional<TemporalInstant> instant;
    private final Optional<TemporalInterval> interval;
    private final RyaIRI subject;

    private final boolean isInstant;

    /**
     * Creates a new {@link Event} query object with a {@link TemporalInstant}.
     * @param geo - The {@link Geometry} to use when querying.
     * @param instant - The {@link TemporalInstant} to use when querying.
     * @param subject - The Subject that both statements must have when querying.
     */
    private Event(final Geometry geo, final TemporalInstant instant, final RyaIRI subject) {
        this.subject = requireNonNull(subject);

        //these fields are nullable since they are filled field by field.
        this.instant = Optional.ofNullable(instant);
        geometry = Optional.ofNullable(geo);
        isInstant = true;
        interval = Optional.empty();
    }

    /**
     * Creates a new {@link Event} query object with a {@link TemporalInterval}.
     * @param geo - The {@link Geometry} to use when querying.
     * @param interval - The {@link TemporalInterval} to use when querying.
     * @param subject - The Subject that both statements must have when querying.
     */
    private Event(final Geometry geo, final TemporalInterval interval, final RyaIRI subject) {
        this.subject = requireNonNull(subject);

        //these fields are nullable since they are filled field by field.
        this.interval = Optional.ofNullable(interval);
        geometry = Optional.ofNullable(geo);
        isInstant = false;
        instant = Optional.empty();
    }

    /**
     * @return Whether or not the query object uses a {@link TemporalInstant}.
     */
    public boolean isInstant() {
        return isInstant;
    }

    /**
     * @return The {@link Geometry} to use when querying.
     */
    public Optional<Geometry> getGeometry() {
        return geometry;
    }

    /**
     * @return The {@link TemporalInstant} to use when querying.
     */
    public Optional<TemporalInstant> getInstant() {
        return instant;
    }

    /**
     * @return The {@link TemporalInterval} to use when querying.
     */
    public Optional<TemporalInterval> getInterval() {
        return interval;
    }

    /**
     * @return The statement subject.
     */
    public RyaIRI getSubject() {
        return subject;
    }

    @Override
    public int hashCode() {
        if(isInstant) {
            return Objects.hash(subject, geometry, instant);
        } else {
            return Objects.hash(subject, geometry, interval);
        }
    }

    @Override
    public boolean equals(final Object o) {
        if(this == o) {
            return true;
        }
        if(o instanceof Event) {
            final Event event = (Event) o;
            return Objects.equals(subject, event.subject) &&
                    Objects.equals(isInstant, event.isInstant) &&
                    (isInstant ? Objects.equals(instant, event.instant) : Objects.equals(interval, event.interval));
        }
        return false;
    }

    public static Builder builder(final Event event) {
        final Builder builder = new Builder()
            .setSubject(event.getSubject());
        if(event.getGeometry().isPresent()) {
            builder.setGeometry(event.getGeometry().get());
        }
        if(event.isInstant()) {
            if(event.getInstant().isPresent()) {
                builder.setTemporalInstant(event.getInstant().get());
            }
        } else {
            if(event.getInterval().isPresent()) {
                builder.setTemporalInterval(event.getInterval().get());
            }
        }
        return builder;
    }

    public static Builder builder() {
        return new Builder();
    }

    /**
     * Builds instances of {@link Event}.
     */
    @DefaultAnnotation(NonNull.class)
    public static class Builder {
        private RyaIRI subject;
        private Geometry geo;
        private TemporalInstant instant;
        private TemporalInterval interval;

        /**
         * Sets the {@link RyaIRI} subject.
         * @param subject - The subject to key on the event.
         */
        public Builder setSubject(final RyaIRI subject) {
            this.subject = subject;
            return this;
        }

        /**
         * Sets the {@link Geometry}.
         * @param geo - The geometry.
         */
        public Builder setGeometry(final Geometry geo) {
            this.geo = geo;
            return this;
        }

        /**
         * Sets the {@link TemporalInterval}.
         * @param interval - The interval.
         */
        public Builder setTemporalInterval(final TemporalInterval interval) {
            this.interval = interval;
            return this;
        }

        /**
         * Sets the {@link TemporalInstant}.
         * @param instant - The instant.
         */
        public Builder setTemporalInstant(final TemporalInstant instant) {
            this.instant = instant;
            return this;
        }

        /**
         * @return The new {@link Event}.
         */
        public Event build() {
            if(instant == null) {
                return new Event(geo, interval, subject);
            } else {
                return new Event(geo, instant, subject);
            }
        }
    }
}
