// Copyright (C) 2018 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.
(function() {
  'use strict';
  Polymer({
    is: 'gr-opacity-diff-mode',

    properties: {
      baseImage: Object,
      revisionImage: Object,
      opacityValue: Number,
    },

    attached() {
      if (this.revisionImage) {
        const srcRevision = this.computeSrcString(this.revisionImage);
        this.$.imageRevision.setAttribute('src', srcRevision);
        this.handleOpacityChange();
      }
      if (this.baseImage) {
        const srcBase = this.computeSrcString(this.baseImage);
        this.$.imageBase.setAttribute('src', srcBase);
      }
      this.resizeDiffContainerHeight();
    },

    handleOpacityChange() {
      this.customStyle['--my-opacity-value'] = this.$.opacitySlider.value;
      this.updateStyles();
    },

    computeSrcString(image) {
      return 'data:' + image['type'] + ';base64, ' + image['body'];
    },

    handleScaleSizesToggle() {
      let width;
      let height;
      if (this.$.scaleSizesToggle.checked &&
          this.baseImage && this.revisionImage) {
        width = Math.max(this.revisionImage._width, this.baseImage._width);
        height = Math.max(this.revisionImage._height, this.baseImage._height);
      }
      this.customStyle['--img-width'] = width ? width + 'px' : null;
      this.customStyle['--img-height'] = height ? height + 'px' : null;
      this.updateStyles();
    },

    resizeDiffContainerHeight() {
      const maxHeight = Math.max(
          this.baseImage ? this.baseImage._height : 0,
          this.revisionImage ? this.revisionImage._height : 0);
      this.customStyle['--div-height'] = maxHeight + 'px';
      const maxWidth = Math.max(
          this.baseImage ? this.baseImage._width : 0,
          this.revisionImage ? this.revisionImage._width : 0);
      this.customStyle['--div-width'] = maxWidth + 'px';
      this.updateStyles();
    },
  });
})();
