/*
 * 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 '../../../base-ui/BaseElement';
import LitSwitch, { LitSwitchChangeEvent } from '../../../base-ui/switch/lit-switch';
import '../../../base-ui/select/LitAllocationSelect';

import '../../../base-ui/switch/lit-switch';
import { LitAllocationSelect } from '../../../base-ui/select/LitAllocationSelect';
import { SpRecordTrace } from '../SpRecordTrace';
import { Cmd } from '../../../command/Cmd';
import { SpVmTrackerHtml } from './SpVmTracker.html';
import { LitSelectV } from '../../../base-ui/select/LitSelectV';

@element('sp-vm-tracker')
export class SpVmTracker extends BaseElement {
  private vmTrackerProcessInput: LitSelectV | undefined | null;

  set startSamp(start: boolean) {
    if (start) {
      this.setAttribute('startSamp', '');
    } else {
      this.removeAttribute('startSamp');
      let input = this.vmTrackerProcessInput?.shadowRoot?.querySelector<HTMLInputElement>('#singleInput');
      input && (input.value = '');
    }
  }

  get process(): string {
    if (this.vmTrackerProcessInput!.value.length > 0) {
      let result = this.vmTrackerProcessInput!.value.match(/\((.+?)\)/g);
      if (result) {
        return result.toString().replace('(', '').replace(')', '');
      } else {
        return this.vmTrackerProcessInput!.value;
      }
    }
    return '';
  }

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

  initElements(): void {
    let vmTrackerSwitch = this.shadowRoot?.querySelector('lit-switch') as LitSwitch;
    vmTrackerSwitch.addEventListener('change', (event: CustomEventInit<LitSwitchChangeEvent>) => {
      let detail = event.detail;
      if (detail!.checked) {
        this.startSamp = true;
        this.unDisable();
      } else {
        this.startSamp = false;
        this.disable();
      }
    });
    this.vmTrackerProcessInput = this.shadowRoot?.querySelector<LitSelectV>('lit-select-v');
    let vmTrackerMul = this.vmTrackerProcessInput?.shadowRoot?.querySelector('input') as HTMLDivElement;
    vmTrackerMul!.addEventListener('mousedown', () => {
      if (this.startSamp && (SpRecordTrace.serialNumber === '')) {
        this.vmTrackerProcessInput!.dataSource([], '');
      }
    });
    vmTrackerMul!.addEventListener('mouseup', () => {
      if (this.startSamp) {
        if (SpRecordTrace.serialNumber === '') {
          this.vmTrackerProcessInput!.dataSource([], '');
        } else {
          Cmd.getProcess().then((processList) => {
            if (processList.length > 0) {
              this.vmTrackerProcessInput!.dataSource(processList, '', true);
            } else {
              this.vmTrackerProcessInput!.dataSource([], '');
            }
          });
        }
        vmTrackerMul!.removeAttribute('readonly');
      } else {
        vmTrackerMul!.setAttribute('readonly', 'readonly');
        return;
      }
    });
    this.disable();
  }

  private unDisable(): void {
    let configVal = this.shadowRoot?.querySelectorAll<HTMLElement>('.config');
    configVal!.forEach((configVal1) => {
      configVal1.removeAttribute('disabled');
    });
  }

  private disable(): void {
    let configVal = this.shadowRoot?.querySelectorAll<HTMLElement>('.config');
    configVal!.forEach((configVal1) => {
      if (configVal1.title !== 'Start VM Tracker Record') {
        configVal1.setAttribute('disabled', '');
      }
    });
  }

  initHtml(): string {
    return SpVmTrackerHtml;
  }
}