/**
 * @license
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import {CodeOwnerService} from './code-owners-service.js';
import {ModelLoader} from './code-owners-model-loader.js';
import {CodeOwnersModel} from './code-owners-model.js';

/**
 * The CodeOwnersMixin adds several properties to a class and translates
 * 'model-property-changed' events from the model to the notifyPath calls.
 * This allows to use properties of the model in observers, calculated
 * properties and bindings.
 * It is guaranteed, that model and modelLoader are set only if change,
 * reporting and restApi properties are set.
 */
export const CodeOwnersModelMixin = Polymer.dedupingMixin(base => {
  return class extends base {
    constructor(...args) {
      super(...args);
      /**
       * The modelLoader allows an element to request a property
       * Typically should be used in loadPropertiesAfterModelChanged
       * to ensure that all required model properties are loaded
       */
      this.modelLoader = undefined;
    }
    static get properties() {
      return {
        /* The following 3 properties (change, reporting, restApi) have to be
         * set from the outside for the mixin to work.
         */
        change: Object,
        reporting: Object,
        restApi: Object,
        model: {
          type: Object,
          observer: '_modelChanged',
        },
      };
    }

    static get observers() {
      return ['onInputChanged(restApi, change, reporting)'];
    }

    onInputChanged(restApi, change, reporting) {
      if ([restApi, change, reporting].includes(undefined)) {
        this.model = undefined;
        this.modelLoader = undefined;
        return;
      }
      const ownerService = CodeOwnerService.getOwnerService(
          this.restApi,
          this.change
      );
      const model = CodeOwnersModel.getModel(change);
      this.modelLoader = new ModelLoader(ownerService, model);
      // Assign model after modelLoader, so modelLoader can be used in
      // the _requirePropertiesAfterModelChanged method
      this.model = model;
    }

    _modelChanged(newModel) {
      if (this.modelPropertyChangedUnsubscriber) {
        this.modelPropertyChangedUnsubscriber();
        this.modelPropertyChangedUnsubscriber = undefined;
      }
      if (!newModel) return;
      const propertyChangedListener = e => {
        this.notifyPath(`model.${e.detail.propertyName}`);
      };
      newModel.addEventListener('model-property-changed',
          propertyChangedListener);
      this.modelPropertyChangedUnsubscriber = () => {
        newModel.removeEventListener('model-property-changed',
            propertyChangedListener);
      };
      this.loadPropertiesAfterModelChanged();
    }

    loadPropertiesAfterModelChanged() {
      // The class should override this method and calls appropriate methods
      // from this.modelLoader to ensure that all required properties are
      // set in model.
    }
  };
});
