/* 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']
        }),
        MockComponent({
          selector: 'app-finished-notifications', inputs: [ 'responsiblitySelection',
            'withCheckboxes', 'withEditButtons', 'isCollapsible', 'stayHidden', 'gridId']
        }),
        MockComponent({
          selector: 'app-open-notifications', inputs: [ 'responsiblitySelection',
            'withCheckboxes', 'withEditButtons', 'isCollapsible', 'stayHidden', 'gridId']
        }),
        MockComponent({
          selector: 'app-future-notifications', inputs: [ 'responsiblitySelection',
            'withCheckboxes', 'withEditButtons', 'isCollapsible', 'stayHidden', 'gridId']
        }),

        // 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);

    });
  }));

  xit('should open the browser print function on button click', async(() => {
    
        
      }));

  });
