/*
 * Copyright (C) 2022 Huawei Device Co., Ltd.
 * 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 { BaseElement, element } from '../BaseElement';

@element('lit-button')
export class LitButton extends BaseElement {
  private slotHtml: HTMLElement | undefined;
  private button: HTMLButtonElement | null | undefined;
  private litIcon: LitButton | null | undefined;

  static get observedAttributes(): string[] {
    return [
      'text',
      'back',
      'icon',
      'height',
      'width',
      'color',
      'font_size',
      'border',
      'padding',
      'justify_content',
      'border_radius',
      'margin_icon',
      'opacity',
    ];
  }

  get text(): string {
    return this.getAttribute('text') || '';
  }

  set text(text: string) {
    this.setAttribute('text', text);
  }

  get back(): string {
    return this.getAttribute('back') || '';
  }

  set back(backColor: string) {
    this.button!.style.backgroundColor = backColor;
    this.setAttribute('back', backColor);
  }

  get icon(): string {
    return this.getAttribute('icon') || '';
  }

  set icon(icon: string) {
    this.litIcon?.setAttribute('name', icon);
    this.setAttribute('icon', icon);
    if (icon) {
      this.litIcon!.style.display = 'block';
    }
  }

  get height(): string {
    return this.getAttribute('height') || '';
  }

  set height(height: string) {
    this.setAttribute('height', height);
  }

  get width(): string {
    return this.getAttribute('width') || '';
  }

  set width(width: string) {
    this.setAttribute('width', width);
  }

  set color(color: string) {
    this.setAttribute('color', color);
  }

  set font_size(fontSize: string) {
    this.setAttribute('font_size', fontSize);
  }

  set border(border: string) {
    this.setAttribute('border', border);
  }

  set padding(padding: string) {
    this.setAttribute('padding', padding);
  }

  set justify_content(justifyContent: string) {
    this.setAttribute('justify_content', justifyContent);
  }

  set border_radius(borderRadius: string) {
    this.setAttribute('border_radius', borderRadius);
  }

  set margin_icon(value: string) {
    this.litIcon?.setAttribute('margin_icon', value);
  }

  set opacity(value: string) {
    this.litIcon?.setAttribute('opacity', value);
  }

  set hidden(hidden: boolean) {
    if (hidden) {
      this.setAttribute('hidden', 'true');
      this.style.display = 'none';
    } else {
      this.removeAttribute('hidden');
      this.style.display = 'block';
    }
  }

  initHtml(): string {
    return `
        ${this.initHtmlStyle()}
        <div id='custom-div'>
                <button id="custom-button" type="button">
                    <slot id="sl" tyle= "padding: 10px"></slot>
                    <lit-icon id="button-icon" name="" size="18" style= "margin-left: 10px" color="var(--dark-color1,#4D4D4D)"></lit-icon>
                 </button>
            </div>
            `;
  }

  private initHtmlStyle(): string {
    return `
    <style>
        :host{ 
            display: block;
            width: 100%;
            height: 100%;
            position: relative;
            background: background: var(--dark-background3,#FFFFFF);
        }
        
        #custom-button{ 
            display: flex;
            flex-direction: row;
            align-items: center;
            align-content: center;
            justify-content: right;
            cursor: pointer;
            color: var(--dark-background3,#FFFFFF);
            background: var(--dark-background3,#FFFFFF);
            border: 2px solid #409eff;
            border-radius: 20px;
            padding: 15px;
            transition: opacity 0.2s;
            outline: none;
            position: relative;
         }
            #custom-button::before {
              position: absolute;
              top: 50%;
              left: 50%;
              width: 100%;
              height: 100%;
              background-color: #000;
              border: inherit;
              border-color: #000;
              border-radius: inherit;
              transform: translate(-50%, -50%);
              opacity: 0;
              content: ' ';
            }
            #custom-button:active::before {
              opacity: 0.1;
            }
        </style>
    `;
  }

  initElements(): void {
    this.slotHtml = this.shadowRoot?.querySelector('#sl') as HTMLElement;
    this.button = this.shadowRoot?.querySelector('#custom-button');
    this.litIcon = this.shadowRoot?.querySelector('#button-icon') as LitButton;
    if (this.litIcon.getAttribute('name') === '') {
      this.litIcon!.style.display = 'none';
    }
  }

  attributeChangedCallback(name: string, oldValue: string, value: string): void {
    switch (name) {
      case 'text':
        this.slotHtml!.innerText = value;
        break;
      case 'back':
        this.button!.style.backgroundColor = value;
        break;
      case 'icon':
        this.litIcon?.setAttribute('name', value);
        if (value) {
          this.litIcon!.style.display = 'block';
        }
        break;
      case 'height':
        this.button!.style.height = value;
        break;
      case 'color':
        this.button!.style.color = value;
        break;
      case 'font_size':
        this.button!.style.fontSize = value;
        break;
      case 'border':
        this.button!.style.border = value;
        break;
      case 'padding':
        this.button!.style.padding = value;
        break;
      case 'justify_content':
        this.button!.style.justifyContent = value;
        break;
      case 'border_radius':
        this.button!.style.borderRadius = value;
        break;
      case 'margin_icon':
        this.litIcon!.style.margin = value;
        break;
      case 'opacity':
        this.button!.style.opacity = value;
        break;
    }
  }
}