@startuml

interface LocalizacionAdapter{
    + provincia(lat: float, long: float): Provincia
    + departamento(lat: float, long: float): Departamento
    + municipio(lat: float, long: float): Municipio
    + provincias(): List<Provincia>
    + municipiosDeProvincia(provincia Provincia): List<Municipio>
    + departamentosDeProvincia(provincia Provincia): List<Departamento>
}
LocalizacionAdapter ..> Provincia
LocalizacionAdapter ..> Departamento
LocalizacionAdapter ..> Municipio

interface GeoRefService{
    + provincias(campos: String): ListadoDeProvincias
    + municipios(idProvincia: int, campos: String): ListadoDeMunicipios
    + departamentos(idProvincia: int, campos: String): ListadoDeDepartamentos
    + ubicacion(lat: float, long: float): ResponseUbicacion
}

ServicioGeoRef .up.|> LocalizacionAdapter

ServicioGeoRef .up.> Provincia
ServicioGeoRef .up.> Departamento
ServicioGeoRef .up.> Municipio

class ServicioGeoRef{
    {static} -instancia: ServicioGeoRef
    {static} -urlApi: String
    - retrofit: Retrofit

    -ServicioGeoRef()
    {static}+instancia() : ServicioGeoRef
    + provincia(lat: float, long: float): Provincia
    + departamento(lat: float, long: float): Departamento
    + municipio(lat: float, long: float): Municipio
    + provincias(): List<Provincia>
    + municipiosDeProvincia(provincia Localizacion): List<Municipio>
    + departamentosDeProvincia(provincia Localizacion): List<Departamento>
    -generarLocalizacionDep(lista: ListadoDeDepartamentos): List<Departamento>
    -generarLocalizacionProv(lista: ListadoDeProvincias): List<Provincia>
    -generarLocalizacionMuni(lista: ListadoDeMunicipios): List<Municipio>
}

class ResponseUbicacion{
    + ubicacion: UbicacionGeoRef
    + parametros: Parametro
}

GeoRefService ..> ResponseUbicacion
ResponseUbicacion --> UbicacionGeoRef
ResponseUbicacion --> Parametro

class UbicacionGeoRef{
    + departamento: DepartamentoGeoref
    + lat: float
    + long: float
    + municipio: MunicipioGeoref
    + provincia: ProvinciaGeoref
}

ServicioGeoRef .down.>"usa" GeoRefService

class Parametro{
    + campos: List<String>
    + max: int
    + localizacion: List<String>
}

class ListadoDeDepartamentos{
    + cantidad: int
    + total: int
    + inicio: int
    + parametros: Parametro
    + departamentos: List<Departamento>
}
ListadoDeDepartamentos --> "1..*" DepartamentoGeoref
ListadoDeDepartamentos --> Parametro
ListadoDeProvincias --> Parametro
ListadoDeMunicipios ---> Parametro
class ListadoDeProvincias{
    + cantidad: int
    + total: int
    + inicio: int
    + parametros: Parametro
    + provincias: List<ProvinciaGeoref>
}
ListadoDeProvincias --> "1..*" ProvinciaGeoref
class ListadoDeMunicipios{
    + cantidad: int
    + total: int
    + inicio: int
    + parametros: Parametro
    + municipios: List<MunicipioGeoref>
}
ListadoDeMunicipios --> "1..*" MunicipioGeoref

class DepartamentoGeoref{
    +id: String
    +nombre: String
}
class ProvinciaGeoref{
    +id: String
    +nombre: String
}
class MunicipioGeoref{
    +id: String
    +nombre: String
}

GeoRefService ..> ListadoDeDepartamentos
GeoRefService ..> ListadoDeProvincias
GeoRefService ..> ListadoDeMunicipios

@enduml