import { describe, it, expect } from 'vitest';
import { parseCommandSimple } from '../../../src/permission/bash-parser.js';

// 注意：parseBashCommand 需要初始化 tree-sitter wasm，在单元测试中使用 parseCommandSimple

describe('parseCommandSimple - 简单命令解析', () => {
  describe('基本命令解析', () => {
    it('解析单个命令', () => {
      const result = parseCommandSimple('ls');

      expect(result.name).toBe('ls');
      expect(result.subcommand).toBeUndefined();
      expect(result.args).toEqual([]);
      expect(result.text).toBe('ls');
    });

    it('解析带子命令的命令', () => {
      const result = parseCommandSimple('git status');

      expect(result.name).toBe('git');
      expect(result.subcommand).toBe('status');
      expect(result.args).toEqual([]);
    });

    it('解析带参数的命令', () => {
      const result = parseCommandSimple('git commit -m "message"');

      expect(result.name).toBe('git');
      expect(result.subcommand).toBe('commit');
      expect(result.args).toContain('-m');
    });

    it('解析带 flag 前缀的子命令', () => {
      const result = parseCommandSimple('rm -rf node_modules');

      expect(result.name).toBe('rm');
      // -rf 以 - 开头，所以 node_modules 是第一个非 flag 参数
      expect(result.subcommand).toBe('node_modules');
      expect(result.args).toContain('-rf');
    });
  });

  describe('flag 和参数分离', () => {
    it('短 flag 放入 args', () => {
      const result = parseCommandSimple('ls -la');

      expect(result.name).toBe('ls');
      expect(result.subcommand).toBeUndefined();
      expect(result.args).toContain('-la');
    });

    it('长 flag 放入 args', () => {
      const result = parseCommandSimple('npm install --save-dev');

      expect(result.name).toBe('npm');
      expect(result.subcommand).toBe('install');
      expect(result.args).toContain('--save-dev');
    });

    it('混合 flag 和参数', () => {
      const result = parseCommandSimple('git checkout -b feature-branch');

      expect(result.name).toBe('git');
      expect(result.subcommand).toBe('checkout');
      expect(result.args).toContain('-b');
      expect(result.args).toContain('feature-branch');
    });
  });

  describe('空白处理', () => {
    it('处理前后空格', () => {
      const result = parseCommandSimple('  git status  ');

      expect(result.name).toBe('git');
      expect(result.subcommand).toBe('status');
    });

    it('处理多个空格分隔', () => {
      const result = parseCommandSimple('git   status    -v');

      expect(result.name).toBe('git');
      expect(result.subcommand).toBe('status');
      expect(result.args).toContain('-v');
    });

    it('空字符串返回空命令', () => {
      const result = parseCommandSimple('');

      expect(result.name).toBe('');
      expect(result.subcommand).toBeUndefined();
      expect(result.args).toEqual([]);
    });

    it('只有空格返回空命令', () => {
      const result = parseCommandSimple('   ');

      expect(result.name).toBe('');
    });
  });

  describe('复杂命令', () => {
    it('解析 git push 命令', () => {
      const result = parseCommandSimple('git push origin main --force');

      expect(result.name).toBe('git');
      expect(result.subcommand).toBe('push');
      expect(result.args).toContain('origin');
      expect(result.args).toContain('main');
      expect(result.args).toContain('--force');
    });

    it('解析 npm 命令', () => {
      const result = parseCommandSimple('npm run build -- --watch');

      expect(result.name).toBe('npm');
      expect(result.subcommand).toBe('run');
      expect(result.args).toContain('build');
    });

    it('解析 docker 命令', () => {
      const result = parseCommandSimple('docker run -d -p 8080:80 nginx');

      expect(result.name).toBe('docker');
      expect(result.subcommand).toBe('run');
      expect(result.args).toContain('-d');
      expect(result.args).toContain('-p');
    });

    it('解析管道前的命令', () => {
      // 简单解析不处理管道，只作为普通参数
      const result = parseCommandSimple('cat file.txt');

      expect(result.name).toBe('cat');
      expect(result.subcommand).toBe('file.txt');
    });
  });

  describe('保留原始文本', () => {
    it('text 字段保留原始命令', () => {
      const original = 'git commit -m "fix bug"';
      const result = parseCommandSimple(original);

      expect(result.text).toBe(original);
    });
  });
});

describe('ParsedCommand 结构', () => {
  it('包含所有必要字段', () => {
    const result = parseCommandSimple('git push');

    expect(result).toHaveProperty('name');
    expect(result).toHaveProperty('subcommand');
    expect(result).toHaveProperty('args');
    expect(result).toHaveProperty('text');
  });

  it('args 始终是数组', () => {
    const result = parseCommandSimple('ls');

    expect(Array.isArray(result.args)).toBe(true);
  });
});
