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

package com.azure.resourcemanager.orbital.fluent.models;

import com.azure.core.annotation.Fluent;
import com.azure.core.util.logging.ClientLogger;
import com.azure.resourcemanager.orbital.models.ReleaseMode;
import com.fasterxml.jackson.annotation.JsonProperty;

/** Ground Stations available to schedule Contacts. */
@Fluent
public final class AvailableGroundStationInner {
    /*
     * ID of groundStation.
     */
    @JsonProperty(value = "id", access = JsonProperty.Access.WRITE_ONLY)
    private String id;

    /*
     * Name of the ground station.
     */
    @JsonProperty(value = "name", access = JsonProperty.Access.WRITE_ONLY)
    private String name;

    /*
     * Azure region.
     */
    @JsonProperty(value = "location")
    private String location;

    /*
     * Resource type.
     */
    @JsonProperty(value = "type", access = JsonProperty.Access.WRITE_ONLY)
    private String type;

    /*
     * The properties bag for this resource.
     */
    @JsonProperty(value = "properties", required = true)
    private AvailableGroundStationProperties innerProperties = new AvailableGroundStationProperties();

    /** Creates an instance of AvailableGroundStationInner class. */
    public AvailableGroundStationInner() {
    }

    /**
     * Get the id property: ID of groundStation.
     *
     * @return the id value.
     */
    public String id() {
        return this.id;
    }

    /**
     * Get the name property: Name of the ground station.
     *
     * @return the name value.
     */
    public String name() {
        return this.name;
    }

    /**
     * Get the location property: Azure region.
     *
     * @return the location value.
     */
    public String location() {
        return this.location;
    }

    /**
     * Set the location property: Azure region.
     *
     * @param location the location value to set.
     * @return the AvailableGroundStationInner object itself.
     */
    public AvailableGroundStationInner withLocation(String location) {
        this.location = location;
        return this;
    }

    /**
     * Get the type property: Resource type.
     *
     * @return the type value.
     */
    public String type() {
        return this.type;
    }

    /**
     * Get the innerProperties property: The properties bag for this resource.
     *
     * @return the innerProperties value.
     */
    private AvailableGroundStationProperties innerProperties() {
        return this.innerProperties;
    }

    /**
     * Get the city property: City of ground station.
     *
     * @return the city value.
     */
    public String city() {
        return this.innerProperties() == null ? null : this.innerProperties().city();
    }

    /**
     * Set the city property: City of ground station.
     *
     * @param city the city value to set.
     * @return the AvailableGroundStationInner object itself.
     */
    public AvailableGroundStationInner withCity(String city) {
        if (this.innerProperties() == null) {
            this.innerProperties = new AvailableGroundStationProperties();
        }
        this.innerProperties().withCity(city);
        return this;
    }

    /**
     * Get the providerName property: Ground station provider name.
     *
     * @return the providerName value.
     */
    public String providerName() {
        return this.innerProperties() == null ? null : this.innerProperties().providerName();
    }

    /**
     * Set the providerName property: Ground station provider name.
     *
     * @param providerName the providerName value to set.
     * @return the AvailableGroundStationInner object itself.
     */
    public AvailableGroundStationInner withProviderName(String providerName) {
        if (this.innerProperties() == null) {
            this.innerProperties = new AvailableGroundStationProperties();
        }
        this.innerProperties().withProviderName(providerName);
        return this;
    }

    /**
     * Get the longitudeDegrees property: Longitude of the ground station in decimal degrees.
     *
     * @return the longitudeDegrees value.
     */
    public Float longitudeDegrees() {
        return this.innerProperties() == null ? null : this.innerProperties().longitudeDegrees();
    }

    /**
     * Set the longitudeDegrees property: Longitude of the ground station in decimal degrees.
     *
     * @param longitudeDegrees the longitudeDegrees value to set.
     * @return the AvailableGroundStationInner object itself.
     */
    public AvailableGroundStationInner withLongitudeDegrees(Float longitudeDegrees) {
        if (this.innerProperties() == null) {
            this.innerProperties = new AvailableGroundStationProperties();
        }
        this.innerProperties().withLongitudeDegrees(longitudeDegrees);
        return this;
    }

    /**
     * Get the latitudeDegrees property: Latitude of the ground station in decimal degrees.
     *
     * @return the latitudeDegrees value.
     */
    public Float latitudeDegrees() {
        return this.innerProperties() == null ? null : this.innerProperties().latitudeDegrees();
    }

    /**
     * Set the latitudeDegrees property: Latitude of the ground station in decimal degrees.
     *
     * @param latitudeDegrees the latitudeDegrees value to set.
     * @return the AvailableGroundStationInner object itself.
     */
    public AvailableGroundStationInner withLatitudeDegrees(Float latitudeDegrees) {
        if (this.innerProperties() == null) {
            this.innerProperties = new AvailableGroundStationProperties();
        }
        this.innerProperties().withLatitudeDegrees(latitudeDegrees);
        return this;
    }

    /**
     * Get the altitudeMeters property: Altitude of the ground station.
     *
     * @return the altitudeMeters value.
     */
    public Float altitudeMeters() {
        return this.innerProperties() == null ? null : this.innerProperties().altitudeMeters();
    }

    /**
     * Set the altitudeMeters property: Altitude of the ground station.
     *
     * @param altitudeMeters the altitudeMeters value to set.
     * @return the AvailableGroundStationInner object itself.
     */
    public AvailableGroundStationInner withAltitudeMeters(Float altitudeMeters) {
        if (this.innerProperties() == null) {
            this.innerProperties = new AvailableGroundStationProperties();
        }
        this.innerProperties().withAltitudeMeters(altitudeMeters);
        return this;
    }

    /**
     * Get the releaseMode property: Release Status of a ground station.
     *
     * @return the releaseMode value.
     */
    public ReleaseMode releaseMode() {
        return this.innerProperties() == null ? null : this.innerProperties().releaseMode();
    }

    /**
     * Set the releaseMode property: Release Status of a ground station.
     *
     * @param releaseMode the releaseMode value to set.
     * @return the AvailableGroundStationInner object itself.
     */
    public AvailableGroundStationInner withReleaseMode(ReleaseMode releaseMode) {
        if (this.innerProperties() == null) {
            this.innerProperties = new AvailableGroundStationProperties();
        }
        this.innerProperties().withReleaseMode(releaseMode);
        return this;
    }

    /**
     * Validates the instance.
     *
     * @throws IllegalArgumentException thrown if the instance is not valid.
     */
    public void validate() {
        if (innerProperties() == null) {
            throw LOGGER
                .logExceptionAsError(
                    new IllegalArgumentException(
                        "Missing required property innerProperties in model AvailableGroundStationInner"));
        } else {
            innerProperties().validate();
        }
    }

    private static final ClientLogger LOGGER = new ClientLogger(AvailableGroundStationInner.class);
}
