export default (input) => {
  if (typeof input === "string") input = input.split(/\s+/g);
  const args = { _: [] };
  let curr = null;
  let concated = "";
  for (let i = 0; i < input.length; i++) {
    const a = input[i];
    if ((a.startsWith("--") || a.startsWith("—")) && !curr) {
      if (a.includes("=")) {
        const [arg, value] = (a.startsWith("--") ? a.slice(2).split("=") : a.slice(1).split("="));
        let ended = true;
        if (arg !== "_") {
          if (value.startsWith("\"")) {
            if (value.endsWith("\"")) {
              args[arg] = value.slice(1).slice(0, -1);
            } else {
              args[arg] = `${value.slice(1)} `;
              ended = false;
            }
          } else if (value.endsWith("\"")) {
            args[arg] += a.slice(0, -1);
          } else if (value !== "") {
            args[arg] = value;
          } else {
            args[arg] = true;
          }
          if (args[arg] === "true") {
            args[arg] = true;
          } else if (args[arg] === "false") {
            args[arg] = false;
          }
          if (!ended) curr = arg;
        }
      } else {
        args[a.slice(2)] = true;
      }
    } else if (curr) {
      if (a.endsWith("\"")) {
        args[curr] += a.slice(0, -1);
        curr = null;
      } else {
        args[curr] += `${a} `;
      }
    } else {
      if (concated !== "") {
        concated += `${a} `;
      } else {
        args._.push(a);
      }
    }
  }

  if (curr && args[curr] == "") {
    args[curr] = true;
  }

  return args;
};

// /*
// Format: 
// [{name: "verbose", type: "bool"}, {name: "username", type: "string"}]
// */
// export default (input, format) => {
//     let results = {};
//     let text = input.split(' ').slice(1).join(' ');
//     format.forEach(element => {
//         if(element.pos !== undefined) return;
//         switch (element.type) {
//             case "bool":                
//                 res = text.match(`--${element.name}[ |=](.*?)($| )`);                
//                 if(res) {
//                     text = text.replace(res[0], ""); 
//                     results[element.name] = (res[1].toLowerCase() == "true");
//                 } else {
//                     res = text.match(`--${element.name}`);
//                     if(res) text = text.replace(res[0], "");
//                     results[element.name] = (res != null);
//                 }
//                 break;
//             case "string":
//                 res = text.match(`--${element.name}[ |=](.*?)($| )`);              
//                 if(res) text = text.replace(res[0], "");                
//                 results[element.name] = (res ? res[1].replace('\\','') : null);                
//                 break;
//             case "int":
//                 res = text.match(`--${element.name}[ |=](.*?)($| )`);
//                 if(res) text = text.replace(res[0], "");
//                 results[element.name] = (res ? parseInt(res[1]) : null);
//                 break;
//             case "float":
//                 res = text.match(`--${element.name}[ |=](.*?)($| )`);
//                 if(res) text = text.replace(res[0], "");
//                 results[element.name] = (res ? parseFloat(res[1]) : null);
//                 break;
//             default:
//                 throw Error("unknown type");
//                 break;
//         }        
//     });
//     let s = text.split(' ');
//     results._ = text;
//     format.forEach(element => {        
//         if(element.pos === undefined) return;
//         if(element.pos <= s.length) {
//             results[element.name] = s[element.pos];
//         } else {
//             results[element.name] = null;
//         }
//     })
//     return results;
// }