import autocomplete from '@moyuyc/inquirer-autocomplete-prompt'
import chalk from 'chalk'
import fuzzy from 'fuzzy'
import inquirer, { Answers, ConfirmQuestion } from 'inquirer'
import jsonFormat from 'json-format'
import ora, { Ora } from 'ora'
import path from 'path'
import Base from './base'

interface DeleteInterface {
  init(): Promise<void>

  delete(): Promise<void>
}

export default abstract class Delete extends Base implements DeleteInterface {
  protected selectList: string = ''

  protected constructor() {
    super()
  }

  public async init(): Promise<void> {
    await this.getAppJson()
    await this.getProjectConfig()
    inquirer.registerPrompt('autocomplete', autocomplete)
    inquirer.prompt([
      this.__selectList(),
      this.__isDetele()
    ]).then(({selectList, isDelete}: any) => {
      this.selectList = selectList
      if (isDelete) this.delete()
    }).catch(console.log)
  }

  public async delete(): Promise<void> {
    const loading: Ora = ora('正在删除...').start()
    let deleteRoot: string = path.join(this.projectRoot, this.selectList)
    let deleteArr: string[] = deleteRoot.split('/')
    deleteArr.splice(deleteArr.length - 1, 1)
    deleteRoot = deleteArr.join('/')
    // 删除文件
    loading.text = '删除文件'
    await this.trash(deleteRoot)
    // 修改app.json
    this.subList.map((v: any, k) => {
      if (v.path === this.selectList) {
        if (v.subpackage) {
          let subIdx: any = this.AppJson.subpackages[v.index]
          let idx: number = subIdx[this.typeRoot].findIndex(f => path.join(subIdx.root, f) === v.path)
          subIdx[this.typeRoot].splice(idx, 1)
        } else {
          this.AppJson[this.typeRoot].splice(k, 1)
        }
      }
    })
    loading.text = '修改app.json'
    await this.writeFile(this.projectRoot, 'app.json', jsonFormat(this.AppJson))
    // 如果是page则还需要修改project.config.json
    if (this.typeName === '页面') {
      let projectIdx = this.projectConfigJson.condition.miniprogram.list
      let index = projectIdx.findIndex(v => v.pathName === deleteRoot)
      projectIdx.splice(index, 1)
      loading.text = '修改project.config.json'
      await this.writeFile(this.projectRoot, 'project.config.json', jsonFormat(this.projectConfigJson))
    }
    loading.succeed(chalk.green(`删除【${this.selectList}】成功`))
  }

  private __selectList(): object {
    return {
      type: 'autocomplete',
      name: 'selectList',
      message: chalk.red(`选择你要删除的${this.typeName}：`),
      choices: [],
      suggestOnly: false,
      source: (_answers, input: string) => {
        return Promise.resolve(fuzzy.filter(input, [...this.subList.map(v => v.path)]).map(e => e.original))
      }
    }
  }

  private __isDetele(): ConfirmQuestion<Answers> {
    return {
      type: 'confirm',
      name: 'isDelete',
      message: '删除后可在回收箱恢复，确认删除？',
      default: true
    }
  }


}
