' Copyright 2013-2022 CS GROUP
' Licensed to CS GROUP (CS) under one or more
' contributor license agreements.  See the NOTICE file distributed with
' this work for additional information regarding copyright ownership.
' CS 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.

@startuml

  skinparam svek                  true
  skinparam ClassBackgroundColor  #F3EFEB/CCC9C5
  skinparam ClassArrowColor       #691616
  skinparam ClassBorderColor      #691616
  skinparam NoteBackgroundColor   #F3EFEB
  skinparam NoteBorderColor       #691616
  skinparam NoteFontColor         #691616
  skinparam ClassFontSize         11

  package org.orekit.rugged #ECEBD8 {

    package utils #DDEBD8 {
      interface ParametricModel {
         +getNbEstimatedParameters()
         +getEstimatedParameters(parameters, start, length)
        +setEstimatedParameters(parameters, start, length)
      }
      enum ParameterType {
        +FIXED
        +ESTIMATED
      }
    }

    package linesensor #DDEBD8 {
      class LineSensor
    }

    package los #DDEBD8 {

      interface TimeDependentLOS {
        +getNbPixels()
        +getLOS(index, date)
        +getLOS(index, date, parameters)
      }

      interface LOSTransform {
        +transformLOS(i, los, date)
      }

      interface TimeIndependentLOSTransform {
        +transformLOS(i, los)
      }
 

      class LOSBuilder {
        +LOSBuilder(List<Vector3D> rawLOS)
        +LOSBuilder addTransform(TimeIndependentLOSTransform transform)
        +LOSBuilder addTransform(LOSTransform transform)
        +TimeDependentLOS build()
      }

      ParametricModel             <|.. TimeDependentLOS
      ParametricModel             <|.. LOSTransform
      ParametricModel             <|.. TimeIndependentLOSTransform
      PolynomialRotation          --|> LOSTransform
      ParameterType               <--*  PolynomialRotation
      FixedRotation               --|> TimeIndependentLOSTransform
      ParameterType               <--*  FixedRotation
      TimeDependentLOS            <--  LOSBuilder : builds
      TimeIndependentLOSTransform <--  LOSBuilder : combines
      LOSTransform                <--  LOSBuilder : combines

      LineSensor                  "1" *--> TimeDependentLOS

    }

  }

  package o.a.c.m.analysis.differentiation #C4D2C5 {
    class DerivativeStructure #D5E0D5/E2EBE2 {
      +getOrder()
      +getValue()
      +getPartialDerivatives(order1, order2, ...)
    }
    LOSTransform --> DerivativeStructure
    TimeIndependentLOSTransform --> DerivativeStructure
  }

@enduml