/**
 * Copyright (c) 2025 SoftCorporation LLC. All rights reserved.
 *
 * The Software License, Version 1.0
 *
 * SoftCorporation LLC. grants you ("Licensee") a non-exclusive, royalty free,
 * license to use, modify and redistribute this software in source and binary
 * code form, provided that the following conditions are met:
 *
 * 1. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        SoftCorporation LLC. (http://www.softcorporation.com)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 2. This software and SoftCorporation name must not be used to
 *    promote products derived from the software without prior
 *    written permission. For written permission, please contact
 *    info@softcorporation.com.
 *
 * This software is provided "AS IS," without a warranty of any kind.
 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
 * IN NO EVENT SHALL THE SOFTCORPORATION BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION).
 *
 */
package com.softcorporation.sandi.search.model;

import java.io.Serializable;
import java.util.List;

import com.softcorporation.sandi.base.model.Client;

public class SearchRequest implements Serializable {
    
    private static final long serialVersionUID = -4676442358150919388L;
    
	private String requestId;
    private String clientId;
    private String searchClients;
    private String searchCollections;
    private String resultFields;
    private Integer pageNumber;
    private Integer pageSize;
    private String sortFields;
    private String groupFields;
    private String facetFields;
    private String query;
    private String searchQuery;
    private String filterQuery;
    private String highlightFields;
    private String highlightTags;
    private String precision;
    private Boolean exact;
    private Boolean collapse;
    private Boolean legacy;
    private Boolean synonyms;
    private Boolean dym;
    private Boolean expand;
    private Boolean rerank;
    private Boolean rag;
    private Boolean debug;
    
    private Client client;
    private List<String> fieldList;
    private String collections;
    private List<String> filterList;
    private String queryEmbedding;
    private String queryNLPObject;
    private String expandedQuery;
    
    public SearchRequest() {
    }

    public SearchRequest(String requestId, String clientId) {
        this.requestId = requestId;
        this.clientId = clientId;
    }

    public String getRequestId() {
        return requestId;
    }

    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }

    public String getClientId() {
        return clientId;
    }

    public void setClientId(String clientId) {
        this.clientId = clientId;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getPageNumber() {
        return pageNumber;
    }

    public void setPageNumber(Integer pageNumber) {
        this.pageNumber = pageNumber;
    }

    public String getSearchQuery() {
        return searchQuery;
    }

    public void setSearchQuery(String searchQuery) {
        this.searchQuery = searchQuery;
    }

    public String getFilterQuery() {
        return filterQuery;
    }

    public void setFilterQuery(String filterQuery) {
        this.filterQuery = filterQuery;
    }

    public Client getClient() {
        return client;
    }

    public void setClient(Client client) {
        this.client = client;
    }

    public String getSearchClients() {
        return searchClients;
    }

    public void setSearchClients(String searchClients) {
        this.searchClients = searchClients;
    }

    public String getSearchCollections() {
        return searchCollections;
    }

    public void setSearchCollections(String searchCollections) {
        this.searchCollections = searchCollections;
    }

    public String getResultFields() {
        return resultFields;
    }

    public void setResultFields(String resultFields) {
        this.resultFields = resultFields;
    }

    public String getSortFields() {
        return sortFields;
    }

    public void setSortFields(String sortFields) {
        this.sortFields = sortFields;
    }

    public String getGroupFields() {
        return groupFields;
    }

    public void setGroupFields(String groupFields) {
        this.groupFields = groupFields;
    }

    public String getFacetFields() {
        return facetFields;
    }

    public void setFacetFields(String facetFields) {
        this.facetFields = facetFields;
    }

    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        this.query = query;
    }

    public String getHighlightFields() {
        return highlightFields;
    }

    public void setHighlightFields(String highlightFields) {
        this.highlightFields = highlightFields;
    }

    public String getHighlightTags() {
        return highlightTags;
    }

    public void setHighlightTags(String highlightTags) {
        this.highlightTags = highlightTags;
    }

    public Boolean isExact() {
        return exact;
    }

    public void setExact(Boolean exact) {
        this.exact = exact;
    }

    public Boolean isCollapse() {
        return collapse;
    }

    public void setCollapse(Boolean collapse) {
        this.collapse = collapse;
    }

    public Boolean isLegacy() {
        return legacy;
    }

    public void setLegacy(Boolean legacy) {
        this.legacy = legacy;
    }

    public Boolean isSynonyms() {
        return synonyms;
    }

    public void setSynonyms(Boolean synonyms) {
        this.synonyms = synonyms;
    }
    
    public String getPrecision() {
        return precision;
    }

    public void setPrecision(String precision) {
        this.precision = precision;
    }

    public Boolean isDym() {
        return dym;
    }

    public void setDym(Boolean dym) {
        this.dym = dym;
    }
    
    public Boolean isExpand() {
        return expand;
    }

    public void setExpand(Boolean expand) {
        this.expand = expand;
    }

    public Boolean isRerank() {
        return rerank;
    }

    public void setRerank(Boolean rerank) {
        this.rerank = rerank;
    }

    public Boolean isRag() {
        return rag;
    }

    public void setRag(Boolean rag) {
        this.rag = rag;
    }
    
    public Boolean isDebug() {
        return debug;
    }

    public void setDebug(Boolean debug) {
        this.debug = debug;
    }

    public List<String> getFieldList() {
        return fieldList;
    }

    public void setFieldList(List<String> fieldList) {
        this.fieldList = fieldList;
    }

    public String getCollections() {
        return collections;
    }

    public void setCollections(String collections) {
        this.collections = collections;
    }

    public List<String> getFilterList() {
        return filterList;
    }

    public void setFilterList(List<String> filterList) {
        this.filterList = filterList;
    }

    public String getQueryEmbedding() {
        return queryEmbedding;
    }

    public void setQueryEmbedding(String queryEmbedding) {
        this.queryEmbedding = queryEmbedding;
    }

    public String getQueryNLPObject() {
        return queryNLPObject;
    }

    public void setQueryNLPObject(String queryNLPObject) {
        this.queryNLPObject = queryNLPObject;
    }

    public String getExpandedQuery() {
        return expandedQuery;
    }

    public void setExpandedQuery(String expandedQuery) {
        this.expandedQuery = expandedQuery;
    }

    @Override
    public String toString() {
    	StringBuilder sb = new StringBuilder();
    	sb.append("SearchRequest{");
    	sb.append("requestId='");
    	sb.append(requestId);
    	sb.append('\'');
    	if (clientId != null) {
        	sb.append(" clientId='");
        	sb.append(clientId);
        	sb.append('\'');
    	}
    	if (searchClients != null) {
        	sb.append(" searchClients='");
        	sb.append(searchClients);
        	sb.append('\'');
    	}
    	if (searchCollections != null) {
        	sb.append(" searchCollections='");
        	sb.append(searchCollections);
        	sb.append('\'');
    	}
    	if (resultFields != null) {
        	sb.append(" resultFields='");
        	sb.append(resultFields);
        	sb.append('\'');
    	}
    	if (pageNumber != null) {
        	sb.append(" pageNumber='");
        	sb.append(pageNumber);
        	sb.append('\'');
    	}
    	if (pageSize != null) {
        	sb.append(" pageSize='");
        	sb.append(pageSize);
        	sb.append('\'');
    	}
    	if (sortFields != null) {
        	sb.append(" sortFields='");
        	sb.append(sortFields);
        	sb.append('\'');
    	}
    	if (groupFields != null) {
        	sb.append(" groupFields='");
        	sb.append(groupFields);
        	sb.append('\'');
    	}
    	if (facetFields != null) {
        	sb.append(" facetFields='");
        	sb.append(facetFields);
        	sb.append('\'');
    	}
    	if (query != null) {
        	sb.append(" query='");
        	sb.append(query);
        	sb.append('\'');
    	}
    	if (searchQuery != null) {
        	sb.append(" searchQuery='");
        	sb.append(searchQuery);
        	sb.append('\'');
    	}
    	if (filterQuery != null) {
        	sb.append(" filterQuery='");
        	sb.append(filterQuery);
        	sb.append('\'');
    	}
    	if (highlightFields != null) {
        	sb.append(" highlightFields='");
        	sb.append(highlightFields);
        	sb.append('\'');
    	}
    	if (highlightTags != null) {
        	sb.append(" highlightTags='");
        	sb.append(highlightTags);
        	sb.append('\'');
    	}
    	if (exact != null) {
        	sb.append(" exact='");
        	sb.append(exact);
        	sb.append('\'');
    	}
    	if (collapse != null) {
        	sb.append(" collapse='");
        	sb.append(collapse);
        	sb.append('\'');
    	}
    	if (legacy != null) {
        	sb.append(" legacy='");
        	sb.append(legacy);
        	sb.append('\'');
    	}
      	if (synonyms != null) {
        	sb.append(" synonyms='");
        	sb.append(synonyms);
        	sb.append('\'');
    	}
      	if (precision != null) {
        	sb.append(" precision='");
        	sb.append(precision);
        	sb.append('\'');
    	}
      	if (dym != null) {
        	sb.append(" dym='");
        	sb.append(dym);
        	sb.append('\'');
    	}
       	if (expand != null) {
        	sb.append(" expand='");
        	sb.append(expand);
        	sb.append('\'');
    	}
    	if (rerank != null) {
        	sb.append(" rerank='");
        	sb.append(rerank);
        	sb.append('\'');
    	}
      	if (rag != null) {
        	sb.append(" rag='");
        	sb.append(rag);
        	sb.append('\'');
    	}
      	if (debug != null) {
        	sb.append(" debug='");
        	sb.append(debug);
        	sb.append('\'');
    	}
       	sb.append("}");
        return sb.toString();
    }
}