// eslint-disable-next-line max-classes-per-file
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { MatButtonModule } from '@angular/material/button';
import { MatSelectModule } from '@angular/material/select';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatRadioModule } from '@angular/material/radio';
import { DragDropModule } from '@angular/cdk/drag-drop';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatTabsModule } from '@angular/material/tabs';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatSnackBarModule } from '@angular/material/snack-bar';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MatListModule } from '@angular/material/list';
import { MatButtonToggleModule } from '@angular/material/button-toggle';
import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
import { TranslateModule } from '@ngx-translate/core';
import { MatDialogModule } from '@angular/material/dialog';
import { MatSliderModule } from '@angular/material/slider';
import { HttpClientModule } from '@angular/common/http';
import { HotspotImageComponent } from 'common/components/input-elements/hotspot-image.component';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { ScrollPagesPipe } from 'common/pipes/scroll-pages.pipe';
import { MathEditorModule } from 'common/math-editor.module';
import { DynamicRowsDirective } from 'common/directives/dynamic-rows.directive';
import { TooltipEventTooltipDirective } from 'common/components/tooltip/tooltip-event-tooltip.directive';
import { TooltipComponent } from 'common/components/tooltip/tooltip.component';
import { PointerEventTooltipDirective } from 'common/components/tooltip/pointer-event-tooltip.directive';
import { ClozeChildErrorMessage } from 'common/components/compound-elements/cloze/cloze-child-error-message';
import { TriggerComponent } from 'common/components/trigger/trigger.component';
import { TextComponent } from './components/text/text.component';
import { ButtonComponent } from './components/button/button.component';
import { TextFieldComponent } from './components/input-elements/text-field.component';
import {
  TextFieldSimpleComponent
} from './components/compound-elements/cloze/cloze-child-elements/text-field-simple.component';
import { AutoHeightDirective, TextAreaComponent } from './components/input-elements/text-area.component';
import { CheckboxComponent } from './components/input-elements/checkbox.component';
import { DropdownComponent } from './components/input-elements/dropdown.component';
import { RadioButtonGroupComponent } from './components/input-elements/radio-button-group.component';
import { ImageComponent } from './components/media-elements/image.component';
import { VideoComponent } from './components/media-elements/video.component';
import { AudioComponent } from './components/media-elements/audio.component';
import { SafeResourceUrlPipe } from './pipes/safe-resource-url.pipe';
import { InputBackgroundColorDirective } from './directives/input-background-color.directive';
import { ErrorTransformPipe } from './pipes/error-transform.pipe';
import { SafeResourceHTMLPipe } from './pipes/safe-resource-html.pipe';
import { MediaPlayerControlBarComponent }
  from './components/media-elements/media-player-control-bar/media-player-control-bar.component';
import {
  MediaPlayerTimeFormatPipe
} from './components/media-elements/media-player-control-bar/media-player-time-format.pipe';
import { LikertComponent, LikertRowBackgroundColorPipe } from './components/compound-elements/likert/likert.component';
import {
  LikertRadioButtonGroupComponent
} from './components/compound-elements/likert/likert-radio-button-group.component';
import { ImageMagnifierComponent } from './components/media-elements/image-magnifier.component';
import { RadioGroupImagesComponent } from './components/input-elements/radio-group-images.component';
import { DropListComponent } from './components/input-elements/drop-list/drop-list.component';
import { ClozeComponent } from './components/compound-elements/cloze/cloze.component';
import { SliderComponent } from './components/input-elements/slider.component';
import { SpellCorrectComponent } from './components/input-elements/spell-correct.component';
import { FrameComponent } from './components/frame/frame.component';
import {
  ToggleButtonComponent
} from './components/compound-elements/cloze/cloze-child-elements/toggle-button.component';
import { TextMarkingBarComponent } from './components/text/text-marking-bar/text-marking-bar.component';
import { StyleMarksPipe } from './pipes/styleMarks.pipe';
import { TextMarkingButtonComponent } from './components/text/text-marking-bar/text-marking-button.component';
import { ClozeChildOverlay } from './components/compound-elements/cloze/cloze-child-overlay.component';
import { MarkListPipe } from './pipes/mark-list.pipe';
import { IsDisabledDirective } from './directives/is-disabled.directive';
import { GeometryComponent } from './components/geometry/geometry.component';
import { MathAtanPipe } from './pipes/math-atan.pipe';
import { MathDegreesPipe } from './pipes/math-degrees.pipe';
import { ArrayIncludesPipe } from './pipes/array-includes.pipe';
import { SpinnerComponent } from './components/spinner/spinner.component';
import { GetValuePipe, MathFieldComponent } from './components/input-elements/math-field.component';
import { MeasurePipe } from './pipes/measure.pipe';
import { TextImagePanelComponent } from './components/text-image-panel.component';
import { UnitDefErrorDialogComponent } from './components/unit-def-error-dialog.component';
import { MathTableComponent } from './components/input-elements/math-table.component';

import { TextAreaMathComponent } from './components/input-elements/text-area-math.component';
import { DragImageComponent } from './components/input-elements/drop-list/drag-image.component';
import { DraggableDirective } from './components/input-elements/drop-list/draggable.directive';
import { ImageFullscreenDirective } from 'common/directives/image-fullscreen.directive';

@NgModule({
  imports: [
    CommonModule,
    HttpClientModule,
    DragDropModule,
    MatSelectModule,
    MatRadioModule,
    MatCheckboxModule,
    ReactiveFormsModule,
    FormsModule,
    MatTooltipModule,
    MatIconModule,
    MatFormFieldModule,
    MatInputModule,
    MatDialogModule,
    MatButtonModule,
    TranslateModule,
    MatSliderModule,
    MatButtonToggleModule,
    MatProgressSpinnerModule,
    MathEditorModule,
    MatListModule,
    CdkConnectedOverlay,
    CdkOverlayOrigin,
    DraggableDirective,
    ImageFullscreenDirective
  ],
  declarations: [
    ButtonComponent,
    TriggerComponent,
    TextComponent,
    TextFieldComponent,
    TextFieldSimpleComponent,
    TextAreaComponent,
    TextAreaMathComponent,
    ImageComponent,
    AudioComponent,
    VideoComponent,
    RadioButtonGroupComponent,
    CheckboxComponent,
    DropdownComponent,
    SafeResourceUrlPipe,
    InputBackgroundColorDirective,
    ErrorTransformPipe,
    SafeResourceHTMLPipe,
    ScrollPagesPipe,
    MediaPlayerControlBarComponent,
    MediaPlayerTimeFormatPipe,
    LikertComponent,
    LikertRadioButtonGroupComponent,
    ImageMagnifierComponent,
    RadioGroupImagesComponent,
    DropListComponent,
    ClozeComponent,
    HotspotImageComponent,
    SliderComponent,
    SpellCorrectComponent,
    FrameComponent,
    ToggleButtonComponent,
    TextMarkingBarComponent,
    StyleMarksPipe,
    TextMarkingButtonComponent,
    ClozeChildOverlay,
    MarkListPipe,
    IsDisabledDirective,
    GeometryComponent,
    MathAtanPipe,
    MathDegreesPipe,
    ArrayIncludesPipe,
    SpinnerComponent,
    GetValuePipe,
    MathFieldComponent,
    DynamicRowsDirective,
    TextImagePanelComponent,
    UnitDefErrorDialogComponent,
    TooltipComponent,
    TooltipEventTooltipDirective,
    PointerEventTooltipDirective,
    ClozeChildErrorMessage,
    AutoHeightDirective,
    LikertRowBackgroundColorPipe,
    MathTableComponent,
    DragImageComponent
  ],
  exports: [
    CommonModule,
    MatIconModule,
    MatTabsModule,
    MatButtonModule,
    FormsModule,
    ReactiveFormsModule,
    DragDropModule,
    MatFormFieldModule,
    MatSnackBarModule,
    MatTooltipModule,
    MatDialogModule,
    TranslateModule,
    SafeResourceHTMLPipe,
    ScrollPagesPipe,
    TextMarkingBarComponent,
    ToggleButtonComponent,
    TextFieldComponent,
    TextFieldSimpleComponent,
    TextAreaComponent,
    AudioComponent,
    VideoComponent,
    TextComponent,
    CheckboxComponent,
    SpellCorrectComponent,
    SliderComponent,
    DropdownComponent,
    RadioButtonGroupComponent,
    RadioGroupImagesComponent,
    DropListComponent,
    ClozeComponent,
    HotspotImageComponent,
    LikertComponent,
    ButtonComponent,
    TriggerComponent,
    FrameComponent,
    ImageComponent,
    GeometryComponent,
    MathFieldComponent,
    TextImagePanelComponent,
    TextAreaMathComponent,
    MathTableComponent
  ]
})
export class SharedModule {}

export abstract class APIService {
  abstract getResourceURL(): string;
}