import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output, SimpleChange, SimpleChanges } from '@angular/core';
import { Store } from '@ngrx/store';
import { NgRxCoreAngularNavActions } from '@zionapps/ngrx-angular';
import { INgRxCoreMeta } from '@zionapps/ngrx-core';<% if (ngRxSubStoreLocation) { %>
import { <%= pascalCase(singularDomainName) %>, <%= pascalCase(pluralDomainName) %>Actions } from '<%= ngRxSubStoreLocation %>';<% } else { %>
import { <%= pascalCase(pluralDomainName) %>Actions } from '../../../../../store/<%= paramCase(pluralDomainName) %>/<%= paramCase(pluralDomainName) %>.actions';
import { <%= pascalCase(singularDomainName) %> } from '../../../../../store/<%= paramCase(pluralDomainName) %>/<%= paramCase(pluralDomainName) %>.domain';<% } %>

@Component({
  changeDetection: ChangeDetectionStrategy.OnPush,
  selector: 'app-<%= paramCase(singularDomainName) %>-detail-widget',
  templateUrl: './<%= paramCase(singularDomainName) %>-detail-widget.component.html',
  styleUrls: ['./<%= paramCase(singularDomainName) %>-detail-widget.component.scss'],
})
export class <%= pascalCase(singularDomainName) %>DetailWidgetComponent implements OnChanges {
  @Input() currentId: number;
  @Input() <%= camelCase(singularDomainName) %>: <%= pascalCase(singularDomainName) %>;
  @Input() hasAccess: boolean;
  @Output() editClick = new EventEmitter<<%= pascalCase(singularDomainName) %>>();
  readonly meta: INgRxCoreMeta;

  constructor(private store$: Store<any>) {
    this.meta = { source: '<%= pascalCase(singularDomainName) %>DetailWidgetComponent' };
  }

  ngOnChanges(changes: SimpleChanges): void {
    if (changes.hasAccess) {
      this.handleAccessChanges(changes.hasAccess);
    }
  }

  private handleAccessChanges(change: SimpleChange): void {
    const { currentValue, previousValue } = change;
    if (!previousValue && currentValue) {
      if (this.currentId) {
        this.store$.dispatch(<%= pascalCase(pluralDomainName) %>Actions.SetCurrentId(this.currentId, this.meta));
        this.store$.dispatch(<%= pascalCase(pluralDomainName) %>Actions.FetchOneRemoteRequest(this.currentId, this.meta));
      } else {
        this.store$.dispatch(NgRxCoreAngularNavActions.NavigateByUrlRequest(`/<%= paramCase(componentName) %>`, this.meta));
      }
    }
  }
}
