/* tslint:disable:no-unused-variable */
import { async, fakeAsync, ComponentFixture, TestBed, tick } from '@angular/core/testing';
import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing';
import { By } from '@angular/platform-browser';
import { click } from '../../testing/index';
import { DebugElement, EventEmitter } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { EntryComponent } from '../../dialogs/entry/entry.component';
import { MainNavigationComponent } from '../../common-components/main-navigation/main-navigation.component';
import { ShiftChangeProtocolComponent } from '../../dialogs/shift-change-protocol/shift-change-protocol.component';
import { AbstractListComponent } from '../../lists/abstract-list/abstract-list.component';
import { AuthenticationService } from '../../services/authentication.service';
import { FinishedNotificationsComponent } from '../../lists/finished-notifications/finished-notifications.component';
import { FutureNotificationsComponent } from '../../lists/future-notifications/future-notifications.component';
import { OpenNotificationsComponent } from '../../lists/open-notifications/open-notifications.component';
import { MockComponent } from '../../testing/mock.component';
import { OverviewComponent } from './overview.component';
import { Router } from '@angular/router';
import { User } from '../../model/user';
import { AbstractMockObservableService } from '../../common/abstract-mock-observable.service';
import { LoginCredentials } from '../../model/login-credentials';
import { MdDialogModule, MaterialModule, MdDialog, MdDialogConfig, Overlay, OverlayContainer, OVERLAY_PROVIDERS } from '@angular/material';
import { SessionContext } from '../../common/session-context';
import { StringToDatePipe } from '../../common-components/pipes/string-to-date.pipe';
import { FormattedTimestampPipe } from '../../common-components/pipes/formatted-timestamp.pipe';
import { AppModule } from '../../app.module';
import { NgModule } from '@angular/core';
import { DaterangepickerConfig } from 'ng2-daterangepicker';
import { NotificationService } from '../../services/notification.service';
import { TerritoryResponsibility } from '../../model/territory-responsibility';
import { ResponsibilityService } from '../../services/responsibility.service';
import { RESPONSIBILITIES } from '../../test-data/responsibilities';
import { ReminderService } from '../../services/reminder.service';
import { CurrentRemindersComponent } from '../../lists/current-reminders/current-reminders.component';
import { OPEN_NOTIFICATIONS } from '../../test-data/notifications';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MessageService } from '../../services/message.service';

class FakeRouter {
  navigate(commands: any[]) {
    return commands[0];
  }
}
@NgModule({
  declarations: [EntryComponent, ShiftChangeProtocolComponent],
  entryComponents: [
    EntryComponent, ShiftChangeProtocolComponent
  ]
})
class TestModule { }

describe('OverviewComponent', () => {
  const sessionContext: SessionContext = new SessionContext();
  let component: OverviewComponent;
  let fixture: ComponentFixture<OverviewComponent>;
  let router: Router;
  let mockNotificationService: MockNotificationService;
  let mockRespService: MockResponsibilityService;
  let messageService: MessageService;

  const correctUser: User = {
    id: '44', username: 'carlo', password: 'serverPwd'
    , name: 'Carlo Cottura', specialUser: true, itemName: this.userName
  };
  class MockNotificationService extends AbstractMockObservableService {
    itemChanged$ = new EventEmitter();
    itemAdded$ = new EventEmitter();
    loadCalled = false;
    public getFinishedNotifications(notificationType: string) {
      this.loadCalled = true;
      return this;
    };
  }
  class MockResponsibilityService extends AbstractMockObservableService {
    plannedResponsibilities = null;
    responsibilities = null;

    getPlannedResponsibilities() {
      const resptService = new MockResponsibilityService();
      resptService.content = this.plannedResponsibilities;
      return resptService;
    };
    getResponsibilities() {
      const resptService = new MockResponsibilityService();
      resptService.content = this.responsibilities;
      return resptService;
    }
  }
  class MockAuthService extends AbstractMockObservableService {

    login(creds: LoginCredentials) {
      return this;
    }
  }
  class MockRespService extends AbstractMockObservableService {

    login(creds: LoginCredentials) {
      return this;
    }
  }
  let mockAuthService;
  beforeEach(async(() => {
    mockRespService = new MockResponsibilityService();
    mockNotificationService = new MockNotificationService();
    mockAuthService = new MockAuthService();
    router = new FakeRouter() as any as Router;
    messageService = new MessageService();

    TestBed.overrideModule(BrowserDynamicTestingModule, {
      set: {
        entryComponents: [EntryComponent, ShiftChangeProtocolComponent]
      }
    });

    TestBed.configureTestingModule({
      imports: [
        FormsModule,
        MdDialogModule,
        BrowserAnimationsModule,
        MaterialModule.forRoot()],
      declarations: [
        StringToDatePipe,
        FormattedTimestampPipe,
        AbstractListComponent,
        OverviewComponent,
        EntryComponent,
        MainNavigationComponent,
        ShiftChangeProtocolComponent,
        MockComponent({ selector: 'app-reminder-caller-job-component' }),        
        MockComponent({ selector: 'app-entry' }),
        MockComponent({ selector: 'app-filter', inputs: ['shiftChangeProtocolConfirmed', 
                      'shiftChangeProtocolOpened', 'filterExpanded'] }),
        MockComponent({ selector: 'input', inputs: ['options'] }),
        MockComponent({
          selector: 'app-sorting', inputs: ['columnName', 'initColumnName', 'isDesc', 'defaultState']
        }),
        MockComponent({
          selector: 'app-abstract-list', inputs: [
            'withCheckboxes', 'withEditButtons', 'isCollapsible', 'stayHidden', 'gridId', 'enforceShowReadOnly']
        }),
        MockComponent({
          selector: 'app-finished-notifications', inputs: [ 'responsiblitySelection',
            'withCheckboxes', 'withEditButtons', 'isCollapsible', 'stayHidden', 'gridId', 'enforceShowReadOnly']
        }),
        MockComponent({
          selector: 'app-open-notifications', inputs: [ 'responsiblitySelection',
            'withCheckboxes', 'withEditButtons', 'isCollapsible', 'stayHidden', 'gridId', 'enforceShowReadOnly']
        }),
        MockComponent({
          selector: 'app-future-notifications', inputs: [ 'responsiblitySelection',
            'withCheckboxes', 'withEditButtons', 'isCollapsible', 'stayHidden', 'gridId', 'enforceShowReadOnly']
        }),

        // TODO: the following are only needed because we do not mock away "ShiftChangeProtocolComponent"
        MockComponent({
          selector: 'app-current-information', inputs: [ 'responsiblitySelection',
            'withCheckboxes', 'withEditButtons', 'isCollapsible']
        }),
        MockComponent({
          selector: 'app-responsibility', inputs: [
            'responsiblitySelection']
        }),
        MockComponent({
          selector: 'app-autocomplete',
                        inputs: ['responsibilityForwarding'], 
          outputs: ['responsibilityForwarding']
        }),
        MockComponent({
          selector: 'app-message-banner'})
      ],
      providers: [
        { provide: NotificationService, useValue: mockNotificationService },
        { provide: Router, useValue: router },
        { provide: Overlay, useClass: Overlay },
        { provide: OVERLAY_PROVIDERS, useClass: OVERLAY_PROVIDERS },
        { provide: SessionContext, useValue: sessionContext },
        { provide: DaterangepickerConfig, useClass: DaterangepickerConfig },
        { provide: ResponsibilityService, useValue: mockRespService },
        { provide: ReminderService, useClass: ReminderService },
        { provide: MessageService, useValue: messageService }
      ],
    }).compileComponents();

  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(OverviewComponent);
    component = fixture.componentInstance;
  });

  it('should init correctly with plannedResponsibility if available', async(() => {
    sessionContext.setCurrUser(correctUser);
    mockRespService.plannedResponsibilities = RESPONSIBILITIES;
    fixture.detectChanges();

    fixture.whenStable().then(() => {
      fixture.detectChanges();
      expect(component.responsibilitiesContainer.length).toBe(RESPONSIBILITIES.length);
    });
  }));

  it('should init correctly with plannedResponsibility and open a shiftChangeProtocoll dialog', async(() => {
    let shiftChangeProtocollOpened = false;
    let dialog;

    sessionContext.setCurrUser(correctUser);
    mockRespService.plannedResponsibilities = RESPONSIBILITIES;

    component.dialog.afterOpen.subscribe((value) => {
      dialog = value.componentInstance;
      shiftChangeProtocollOpened = true;
    });

    fixture.detectChanges();
    fixture.whenStable().then(() => {
      fixture.detectChanges();
      console.log(shiftChangeProtocollOpened);
      console.log(dialog);

      expect(shiftChangeProtocollOpened).toBe(true);
  });
  }));

  it('should init correctly with empty plannedResponsibility', async(() => {
    sessionContext.setCurrUser(correctUser);
    mockRespService.plannedResponsibilities = [];
    fixture.detectChanges();
    expect(component.responsibilitiesContainer).toBeUndefined();
  }));

  it('should init correctly with plannedResponsibility not available', async(() => {
    sessionContext.setCurrUser(correctUser);
    mockRespService.error = 'error';
    fixture.detectChanges();
    expect(component.responsibilitiesContainer).toBeUndefined();
  }));

  it('should open dialog to create new notification on button click', async(() => {
    let entryOpend = false;

    sessionContext.setCurrUser(correctUser);
    mockRespService.plannedResponsibilities = RESPONSIBILITIES;

    fixture.detectChanges();
    fixture.whenStable().then(() => { // wait for async getFinishedNotifications
      fixture.detectChanges(); // update view with array
      let des: DebugElement[];
      component.dialog.afterOpen.subscribe(() => entryOpend = true);
      des = fixture.debugElement.queryAll(By.css('.btn-primary'));
      click(des[0]);
      expect(entryOpend).toBe(true);
    });
  }));

  it('should open special dialog to create new notification on button click', async(() => {
    let entryOpend = false;
    let dialog;
    let de: DebugElement;

    sessionContext.setCurrUser(correctUser);
    mockRespService.plannedResponsibilities = RESPONSIBILITIES;
    fixture.detectChanges();

    component.dialog.afterOpen.subscribe((value) => {
      dialog = value.componentInstance;
      entryOpend = true;
  });
    fixture.whenStable().then(() => {
      fixture.detectChanges();
      de = fixture.debugElement.query(By.css('.btn-info'));
      click(de);
      fixture.detectChanges();
      expect(entryOpend).toBe(true);
    });
  }));

  it('should open a dialog to edit a notification on button click', async(() => {
    
    let entryOpend = false;
    let dialog;
    const testNotification = OPEN_NOTIFICATIONS[0];
    
    sessionContext.setCurrUser(correctUser);
    
    fixture.detectChanges();

    component.dialog.afterOpen.subscribe((value) => {
      dialog = value.componentInstance;
      spyOn(dialog, 'setNotification');  
      entryOpend = true;
    });
    component.openDialogEditEntry(testNotification);

    fixture.whenStable().then(() => {
      fixture.detectChanges();    
      expect(entryOpend).toBe(true);
      expect(dialog.isEditDialog).toBe(true);
    
    });
  }));

  it('should open a dialog to view a notification on button click', async(() => {

    let entryOpend = false;
    let dialog;
    const testNotification = OPEN_NOTIFICATIONS[0];
    
    sessionContext.setCurrUser(correctUser);
    
    fixture.detectChanges();

    component.dialog.afterOpen.subscribe((value) => {
      dialog = value.componentInstance;
      spyOn(dialog, 'setNotification');  
      entryOpend = true;
    });
    component.openDialogLookUpEntry(testNotification);

    fixture.whenStable().then(() => {
      fixture.detectChanges();    
      expect(entryOpend).toBe(true);
      expect(dialog.isEditDialog).toBe(false);

    });
  }));

  });
