// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
// Code generated by Microsoft (R) AutoRest Code Generator.

package com.azure.verticals.agrifood.farming.implementation;

import com.azure.core.http.HttpPipeline;
import com.azure.core.http.HttpPipelineBuilder;
import com.azure.core.http.policy.CookiePolicy;
import com.azure.core.http.policy.RetryPolicy;
import com.azure.core.http.policy.UserAgentPolicy;
import com.azure.core.util.serializer.JacksonAdapter;
import com.azure.core.util.serializer.SerializerAdapter;
import com.azure.verticals.agrifood.farming.FarmBeatsServiceVersion;

/** Initializes a new instance of the FarmBeatsClient type. */
public final class FarmBeatsClientImpl {
    /** The Azure FarmBeats account endpoint. */
    private final String endpoint;

    /**
     * Gets The Azure FarmBeats account endpoint.
     *
     * @return the endpoint value.
     */
    public String getEndpoint() {
        return this.endpoint;
    }

    /** Service version. */
    private final FarmBeatsServiceVersion serviceVersion;

    /**
     * Gets Service version.
     *
     * @return the serviceVersion value.
     */
    public FarmBeatsServiceVersion getServiceVersion() {
        return this.serviceVersion;
    }

    /** The HTTP pipeline to send requests through. */
    private final HttpPipeline httpPipeline;

    /**
     * Gets The HTTP pipeline to send requests through.
     *
     * @return the httpPipeline value.
     */
    public HttpPipeline getHttpPipeline() {
        return this.httpPipeline;
    }

    /** The serializer to serialize an object into a string. */
    private final SerializerAdapter serializerAdapter;

    /**
     * Gets The serializer to serialize an object into a string.
     *
     * @return the serializerAdapter value.
     */
    public SerializerAdapter getSerializerAdapter() {
        return this.serializerAdapter;
    }

    /** The ApplicationDatasImpl object to access its operations. */
    private final ApplicationDatasImpl applicationDatas;

    /**
     * Gets the ApplicationDatasImpl object to access its operations.
     *
     * @return the ApplicationDatasImpl object.
     */
    public ApplicationDatasImpl getApplicationDatas() {
        return this.applicationDatas;
    }

    /** The AttachmentsImpl object to access its operations. */
    private final AttachmentsImpl attachments;

    /**
     * Gets the AttachmentsImpl object to access its operations.
     *
     * @return the AttachmentsImpl object.
     */
    public AttachmentsImpl getAttachments() {
        return this.attachments;
    }

    /** The BoundariesImpl object to access its operations. */
    private final BoundariesImpl boundaries;

    /**
     * Gets the BoundariesImpl object to access its operations.
     *
     * @return the BoundariesImpl object.
     */
    public BoundariesImpl getBoundaries() {
        return this.boundaries;
    }

    /** The CropProductsImpl object to access its operations. */
    private final CropProductsImpl cropProducts;

    /**
     * Gets the CropProductsImpl object to access its operations.
     *
     * @return the CropProductsImpl object.
     */
    public CropProductsImpl getCropProducts() {
        return this.cropProducts;
    }

    /** The CropsImpl object to access its operations. */
    private final CropsImpl crops;

    /**
     * Gets the CropsImpl object to access its operations.
     *
     * @return the CropsImpl object.
     */
    public CropsImpl getCrops() {
        return this.crops;
    }

    /** The DeviceDataModelsImpl object to access its operations. */
    private final DeviceDataModelsImpl deviceDataModels;

    /**
     * Gets the DeviceDataModelsImpl object to access its operations.
     *
     * @return the DeviceDataModelsImpl object.
     */
    public DeviceDataModelsImpl getDeviceDataModels() {
        return this.deviceDataModels;
    }

    /** The DevicesImpl object to access its operations. */
    private final DevicesImpl devices;

    /**
     * Gets the DevicesImpl object to access its operations.
     *
     * @return the DevicesImpl object.
     */
    public DevicesImpl getDevices() {
        return this.devices;
    }

    /** The FarmOperationsImpl object to access its operations. */
    private final FarmOperationsImpl farmOperations;

    /**
     * Gets the FarmOperationsImpl object to access its operations.
     *
     * @return the FarmOperationsImpl object.
     */
    public FarmOperationsImpl getFarmOperations() {
        return this.farmOperations;
    }

    /** The FarmsImpl object to access its operations. */
    private final FarmsImpl farms;

    /**
     * Gets the FarmsImpl object to access its operations.
     *
     * @return the FarmsImpl object.
     */
    public FarmsImpl getFarms() {
        return this.farms;
    }

    /** The FieldsImpl object to access its operations. */
    private final FieldsImpl fields;

    /**
     * Gets the FieldsImpl object to access its operations.
     *
     * @return the FieldsImpl object.
     */
    public FieldsImpl getFields() {
        return this.fields;
    }

    /** The HarvestDatasImpl object to access its operations. */
    private final HarvestDatasImpl harvestDatas;

    /**
     * Gets the HarvestDatasImpl object to access its operations.
     *
     * @return the HarvestDatasImpl object.
     */
    public HarvestDatasImpl getHarvestDatas() {
        return this.harvestDatas;
    }

    /** The ImageProcessingsImpl object to access its operations. */
    private final ImageProcessingsImpl imageProcessings;

    /**
     * Gets the ImageProcessingsImpl object to access its operations.
     *
     * @return the ImageProcessingsImpl object.
     */
    public ImageProcessingsImpl getImageProcessings() {
        return this.imageProcessings;
    }

    /** The InsightAttachmentsImpl object to access its operations. */
    private final InsightAttachmentsImpl insightAttachments;

    /**
     * Gets the InsightAttachmentsImpl object to access its operations.
     *
     * @return the InsightAttachmentsImpl object.
     */
    public InsightAttachmentsImpl getInsightAttachments() {
        return this.insightAttachments;
    }

    /** The InsightsImpl object to access its operations. */
    private final InsightsImpl insights;

    /**
     * Gets the InsightsImpl object to access its operations.
     *
     * @return the InsightsImpl object.
     */
    public InsightsImpl getInsights() {
        return this.insights;
    }

    /** The ManagementZonesImpl object to access its operations. */
    private final ManagementZonesImpl managementZones;

    /**
     * Gets the ManagementZonesImpl object to access its operations.
     *
     * @return the ManagementZonesImpl object.
     */
    public ManagementZonesImpl getManagementZones() {
        return this.managementZones;
    }

    /** The ModelInferencesImpl object to access its operations. */
    private final ModelInferencesImpl modelInferences;

    /**
     * Gets the ModelInferencesImpl object to access its operations.
     *
     * @return the ModelInferencesImpl object.
     */
    public ModelInferencesImpl getModelInferences() {
        return this.modelInferences;
    }

    /** The NutrientAnalysesImpl object to access its operations. */
    private final NutrientAnalysesImpl nutrientAnalyses;

    /**
     * Gets the NutrientAnalysesImpl object to access its operations.
     *
     * @return the NutrientAnalysesImpl object.
     */
    public NutrientAnalysesImpl getNutrientAnalyses() {
        return this.nutrientAnalyses;
    }

    /** The OAuthProvidersImpl object to access its operations. */
    private final OAuthProvidersImpl oAuthProviders;

    /**
     * Gets the OAuthProvidersImpl object to access its operations.
     *
     * @return the OAuthProvidersImpl object.
     */
    public OAuthProvidersImpl getOAuthProviders() {
        return this.oAuthProviders;
    }

    /** The OAuthTokensImpl object to access its operations. */
    private final OAuthTokensImpl oAuthTokens;

    /**
     * Gets the OAuthTokensImpl object to access its operations.
     *
     * @return the OAuthTokensImpl object.
     */
    public OAuthTokensImpl getOAuthTokens() {
        return this.oAuthTokens;
    }

    /** The PartiesImpl object to access its operations. */
    private final PartiesImpl parties;

    /**
     * Gets the PartiesImpl object to access its operations.
     *
     * @return the PartiesImpl object.
     */
    public PartiesImpl getParties() {
        return this.parties;
    }

    /** The PlantingDatasImpl object to access its operations. */
    private final PlantingDatasImpl plantingDatas;

    /**
     * Gets the PlantingDatasImpl object to access its operations.
     *
     * @return the PlantingDatasImpl object.
     */
    public PlantingDatasImpl getPlantingDatas() {
        return this.plantingDatas;
    }

    /** The PlantTissueAnalysesImpl object to access its operations. */
    private final PlantTissueAnalysesImpl plantTissueAnalyses;

    /**
     * Gets the PlantTissueAnalysesImpl object to access its operations.
     *
     * @return the PlantTissueAnalysesImpl object.
     */
    public PlantTissueAnalysesImpl getPlantTissueAnalyses() {
        return this.plantTissueAnalyses;
    }

    /** The PrescriptionMapsImpl object to access its operations. */
    private final PrescriptionMapsImpl prescriptionMaps;

    /**
     * Gets the PrescriptionMapsImpl object to access its operations.
     *
     * @return the PrescriptionMapsImpl object.
     */
    public PrescriptionMapsImpl getPrescriptionMaps() {
        return this.prescriptionMaps;
    }

    /** The PrescriptionsImpl object to access its operations. */
    private final PrescriptionsImpl prescriptions;

    /**
     * Gets the PrescriptionsImpl object to access its operations.
     *
     * @return the PrescriptionsImpl object.
     */
    public PrescriptionsImpl getPrescriptions() {
        return this.prescriptions;
    }

    /** The ScenesImpl object to access its operations. */
    private final ScenesImpl scenes;

    /**
     * Gets the ScenesImpl object to access its operations.
     *
     * @return the ScenesImpl object.
     */
    public ScenesImpl getScenes() {
        return this.scenes;
    }

    /** The SeasonalFieldsImpl object to access its operations. */
    private final SeasonalFieldsImpl seasonalFields;

    /**
     * Gets the SeasonalFieldsImpl object to access its operations.
     *
     * @return the SeasonalFieldsImpl object.
     */
    public SeasonalFieldsImpl getSeasonalFields() {
        return this.seasonalFields;
    }

    /** The SeasonsImpl object to access its operations. */
    private final SeasonsImpl seasons;

    /**
     * Gets the SeasonsImpl object to access its operations.
     *
     * @return the SeasonsImpl object.
     */
    public SeasonsImpl getSeasons() {
        return this.seasons;
    }

    /** The SensorDataModelsImpl object to access its operations. */
    private final SensorDataModelsImpl sensorDataModels;

    /**
     * Gets the SensorDataModelsImpl object to access its operations.
     *
     * @return the SensorDataModelsImpl object.
     */
    public SensorDataModelsImpl getSensorDataModels() {
        return this.sensorDataModels;
    }

    /** The SensorEventsImpl object to access its operations. */
    private final SensorEventsImpl sensorEvents;

    /**
     * Gets the SensorEventsImpl object to access its operations.
     *
     * @return the SensorEventsImpl object.
     */
    public SensorEventsImpl getSensorEvents() {
        return this.sensorEvents;
    }

    /** The SensorMappingsImpl object to access its operations. */
    private final SensorMappingsImpl sensorMappings;

    /**
     * Gets the SensorMappingsImpl object to access its operations.
     *
     * @return the SensorMappingsImpl object.
     */
    public SensorMappingsImpl getSensorMappings() {
        return this.sensorMappings;
    }

    /** The SensorPartnerIntegrationsImpl object to access its operations. */
    private final SensorPartnerIntegrationsImpl sensorPartnerIntegrations;

    /**
     * Gets the SensorPartnerIntegrationsImpl object to access its operations.
     *
     * @return the SensorPartnerIntegrationsImpl object.
     */
    public SensorPartnerIntegrationsImpl getSensorPartnerIntegrations() {
        return this.sensorPartnerIntegrations;
    }

    /** The SensorsImpl object to access its operations. */
    private final SensorsImpl sensors;

    /**
     * Gets the SensorsImpl object to access its operations.
     *
     * @return the SensorsImpl object.
     */
    public SensorsImpl getSensors() {
        return this.sensors;
    }

    /** The SolutionInferencesImpl object to access its operations. */
    private final SolutionInferencesImpl solutionInferences;

    /**
     * Gets the SolutionInferencesImpl object to access its operations.
     *
     * @return the SolutionInferencesImpl object.
     */
    public SolutionInferencesImpl getSolutionInferences() {
        return this.solutionInferences;
    }

    /** The TillageDatasImpl object to access its operations. */
    private final TillageDatasImpl tillageDatas;

    /**
     * Gets the TillageDatasImpl object to access its operations.
     *
     * @return the TillageDatasImpl object.
     */
    public TillageDatasImpl getTillageDatas() {
        return this.tillageDatas;
    }

    /** The WeathersImpl object to access its operations. */
    private final WeathersImpl weathers;

    /**
     * Gets the WeathersImpl object to access its operations.
     *
     * @return the WeathersImpl object.
     */
    public WeathersImpl getWeathers() {
        return this.weathers;
    }

    /** The WeatherDatasImpl object to access its operations. */
    private final WeatherDatasImpl weatherDatas;

    /**
     * Gets the WeatherDatasImpl object to access its operations.
     *
     * @return the WeatherDatasImpl object.
     */
    public WeatherDatasImpl getWeatherDatas() {
        return this.weatherDatas;
    }

    /** The ZonesImpl object to access its operations. */
    private final ZonesImpl zones;

    /**
     * Gets the ZonesImpl object to access its operations.
     *
     * @return the ZonesImpl object.
     */
    public ZonesImpl getZones() {
        return this.zones;
    }

    /**
     * Initializes an instance of FarmBeatsClient client.
     *
     * @param endpoint The Azure FarmBeats account endpoint.
     * @param serviceVersion Service version.
     */
    public FarmBeatsClientImpl(String endpoint, FarmBeatsServiceVersion serviceVersion) {
        this(
                new HttpPipelineBuilder()
                        .policies(new UserAgentPolicy(), new RetryPolicy(), new CookiePolicy())
                        .build(),
                JacksonAdapter.createDefaultSerializerAdapter(),
                endpoint,
                serviceVersion);
    }

    /**
     * Initializes an instance of FarmBeatsClient client.
     *
     * @param httpPipeline The HTTP pipeline to send requests through.
     * @param endpoint The Azure FarmBeats account endpoint.
     * @param serviceVersion Service version.
     */
    public FarmBeatsClientImpl(HttpPipeline httpPipeline, String endpoint, FarmBeatsServiceVersion serviceVersion) {
        this(httpPipeline, JacksonAdapter.createDefaultSerializerAdapter(), endpoint, serviceVersion);
    }

    /**
     * Initializes an instance of FarmBeatsClient client.
     *
     * @param httpPipeline The HTTP pipeline to send requests through.
     * @param serializerAdapter The serializer to serialize an object into a string.
     * @param endpoint The Azure FarmBeats account endpoint.
     * @param serviceVersion Service version.
     */
    public FarmBeatsClientImpl(
            HttpPipeline httpPipeline,
            SerializerAdapter serializerAdapter,
            String endpoint,
            FarmBeatsServiceVersion serviceVersion) {
        this.httpPipeline = httpPipeline;
        this.serializerAdapter = serializerAdapter;
        this.endpoint = endpoint;
        this.serviceVersion = serviceVersion;
        this.applicationDatas = new ApplicationDatasImpl(this);
        this.attachments = new AttachmentsImpl(this);
        this.boundaries = new BoundariesImpl(this);
        this.cropProducts = new CropProductsImpl(this);
        this.crops = new CropsImpl(this);
        this.deviceDataModels = new DeviceDataModelsImpl(this);
        this.devices = new DevicesImpl(this);
        this.farmOperations = new FarmOperationsImpl(this);
        this.farms = new FarmsImpl(this);
        this.fields = new FieldsImpl(this);
        this.harvestDatas = new HarvestDatasImpl(this);
        this.imageProcessings = new ImageProcessingsImpl(this);
        this.insightAttachments = new InsightAttachmentsImpl(this);
        this.insights = new InsightsImpl(this);
        this.managementZones = new ManagementZonesImpl(this);
        this.modelInferences = new ModelInferencesImpl(this);
        this.nutrientAnalyses = new NutrientAnalysesImpl(this);
        this.oAuthProviders = new OAuthProvidersImpl(this);
        this.oAuthTokens = new OAuthTokensImpl(this);
        this.parties = new PartiesImpl(this);
        this.plantingDatas = new PlantingDatasImpl(this);
        this.plantTissueAnalyses = new PlantTissueAnalysesImpl(this);
        this.prescriptionMaps = new PrescriptionMapsImpl(this);
        this.prescriptions = new PrescriptionsImpl(this);
        this.scenes = new ScenesImpl(this);
        this.seasonalFields = new SeasonalFieldsImpl(this);
        this.seasons = new SeasonsImpl(this);
        this.sensorDataModels = new SensorDataModelsImpl(this);
        this.sensorEvents = new SensorEventsImpl(this);
        this.sensorMappings = new SensorMappingsImpl(this);
        this.sensorPartnerIntegrations = new SensorPartnerIntegrationsImpl(this);
        this.sensors = new SensorsImpl(this);
        this.solutionInferences = new SolutionInferencesImpl(this);
        this.tillageDatas = new TillageDatasImpl(this);
        this.weathers = new WeathersImpl(this);
        this.weatherDatas = new WeatherDatasImpl(this);
        this.zones = new ZonesImpl(this);
    }
}
