import { ModuleWithProviders, NgModule } from '@angular/core';
import { HypermediaFormsModule, InputComponentResolver } from 'first-npm-package-nicule/forms';

import { CheckboxesFieldComponent, CheckboxFieldComponent, DateFieldComponent, DefaultGroupInputComponent, EmailFieldComponent,
    FileFieldComponent, HiddenFieldComponent, PasswordFieldComponent, SelectFieldComponent, SelectOtherFieldComponent, 
    TextAreaFieldComponent, TextFieldComponent, MultiSelectFieldComponent } from './components';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { MatTooltipModule } from '@angular/material/tooltip';
import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { FormsModule } from '@angular/forms';

const INPUTS = [CheckboxFieldComponent, CheckboxesFieldComponent, DateFieldComponent, EmailFieldComponent, FileFieldComponent,
    DefaultGroupInputComponent, HiddenFieldComponent, PasswordFieldComponent, SelectFieldComponent, TextAreaFieldComponent,
    TextFieldComponent, SelectOtherFieldComponent, MultiSelectFieldComponent ];

@NgModule({
    declarations: INPUTS,
    imports: [
        CommonModule,
        FormsModule,
        TranslateModule,

        MatTooltipModule,
        MatIconModule,
        MatInputModule,
        MatFormFieldModule,
        MatCheckboxModule,
        MatSelectModule,
        MatDatepickerModule,

        HypermediaFormsModule
    ],
    entryComponents: INPUTS
})
export class HypermediaMaterialInputsModule {
    static forRoot(): ModuleWithProviders {
        return {
            ngModule: HypermediaMaterialInputsModule,
            providers: [
                InputComponentResolver.forInputs([{
                    type: 'text',
                    component: TextFieldComponent
                }, {
                    type: 'password',
                    component: PasswordFieldComponent
                }, {
                    type: 'boolean',
                    component: CheckboxFieldComponent
                }, {
                    type: 'option',
                    component: SelectFieldComponent
                }, {
                    type: 'hidden',
                    component: HiddenFieldComponent
                }, {
                    type: 'email',
                    component: EmailFieldComponent
                }, {
                    type: 'file',
                    component: FileFieldComponent
                }, {
                    type: 'date',
                    component: DateFieldComponent
                }, {
                    type: 'group',
                    component: DefaultGroupInputComponent
                }])
            ]
        };
    }
}
