/*
 * 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';

const initHtmlStyle: string = `
    <style>
        :host(:not([collapsed])){ 
            width: 248px;
            display: flex;
            background-color: var(--dark-background);
            cursor: pointer;
            flex-direction: column;
        }
        :host{
            user-select: none;
            transition: background-color .3s;
        }
        :host(:not([collapsed])),:host(:not([second])) ::slotted(lit-main-menu-item){
            display: flex;
        }
        host(:not([collapsed])) :host([second]) ::slotted(lit-main-menu-group){
          display:flex;
        }
        :host([second]) .group-name{
          padding-left:40px;
        }
        :host(:not([collapsed])) .group-describe{
            height: 0;
            visibility: hidden;
            padding:0;
        }
        :host([collapsed]):hover){
            background-color: #FFFFFF;
        }
        :host([collapsed]){
            width: 248px;
            display: flex;
            flex-direction: column;
            cursor: pointer;
            background-color: var(--dark-background);
        }
        :host([collapsed]) .group-describe{
            height: auto;
            visibility: visible;
        }
        :host([radius]) {
            border-radius: 16px 0px 0px 16px ;
        }
        :host([collapsed]) ::slotted(lit-main-menu-item){
            display: none;
        }
        :host([collapsed]) ::slotted(lit-main-menu-group){
          display:none;
        }
        :host(:not([describe])) .group-describe{
          display:none;
        }
        :host([describe]) .group-describe{
          padding: 4px 24px 0 24px;
          color: #999 !important;
          font-size: 12px;
        }
        :host([describe]) .group-name{
          margin-top: 10px;
        }
        .group-name{
            display:flex;
            font-size: 14px;
            font-family: Helvetica;
            color: #000;
            padding: 15px 24px 5px 10px;
            line-height: 16px;
            font-weight: 400;
            text-align: left;
        }
        :host([collapsed]) .icon{
          transform: rotateZ(-90deg);
        }
        </style>
    `;

@element('lit-main-menu-group')
export class LitMainMenuGroup extends BaseElement {
  protected _collapsed: boolean | undefined;
  private groupNameEl: HTMLElement | null | undefined;
  private groupDescEl: HTMLElement | null | undefined;
  private group: HTMLElement | null | undefined;
  private iconEl: HTMLElement | null | undefined;

  static get observedAttributes(): string[] {
    return ['title', 'describe', 'collapsed', 'nocollapse', 'radius', 'second', 'icon'];
  }

  get second(): boolean {
    return this.hasAttribute('second');
  }

  set second(value: boolean) {
    if (value) {
      this.setAttribute('second', '');
    } else {
      this.removeAttribute('second');
    }
  }

  get collapsed(): boolean {
    return this.hasAttribute('collapsed');
  }

  set collapsed(value: boolean) {
    if (value) {
      this.setAttribute('collapsed', '');
    } else {
      this.removeAttribute('collapsed');
    }
  }

  get nocollapsed(): boolean {
    return this.hasAttribute('nocollapsed');
  }

  set nocollapsed(value: boolean) {
    if (value) {
      this.setAttribute('nocollapsed', '');
    } else {
      this.removeAttribute('nocollapsed');
    }
  }

  get radius(): boolean {
    return this.hasAttribute('radius');
  }

  initElements(): void {
    this.groupNameEl = this.shadowRoot?.querySelector('.group-title');
    this.groupDescEl = this.shadowRoot?.querySelector('.group-describe');
    this.iconEl = this.shadowRoot?.querySelector('.icon');
    this.group = this.shadowRoot?.querySelector('#group');
    this.group!.addEventListener('click', (e) => {
      if (this.nocollapsed) {
        return;
      }
      this.collapsed = !this.collapsed;
    });
  }

  initHtml(): string {
    return `
        ${initHtmlStyle}
        <div id="group">
        <div class="group-name">
          <lit-icon class="icon" name="user" size="20"></lit-icon>
          <span class="group-title"></span>
        </div>
        <div class="group-describe"></div>
      </div>
        <slot></slot>
        `;
  }

  attributeChangedCallback(name: string, oldValue: string, newValue: string): void {
    switch (name) {
      case 'title':
        if (this.groupNameEl) {
          this.groupNameEl.textContent = newValue;
        }
        break;
      case 'describe':
        if (this.groupDescEl) {
          this.groupDescEl.textContent = newValue;
        }
        break;
      case 'icon':
        if (this.iconEl) {
          this.iconEl.setAttribute('name', newValue);
        }
        break;
    }
  }
}