import assert from "node:assert/strict";
import { describe, it } from "node:test";

import { lerAparelho, nomeDoModelo, origemDoLink } from "./aparelho.ts";

/* User agents copiados de navegadores reais. */
const IPHONE_SAFARI =
  "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1";
const IPHONE_INSTAGRAM =
  "Mozilla/5.0 (iPhone; CPU iPhone OS 17_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Instagram 330.0.3.12.235 (iPhone14,5; iOS 17_4_1; pt_BR; pt; scale=3.00; 1170x2532; 603256914)";
const ANDROID_CHROME_REDUZIDO =
  "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Mobile Safari/537.36";
const ANDROID_WEBVIEW =
  "Mozilla/5.0 (Linux; Android 13; moto g(60) Build/T1RD33.116-33-3; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/124.0.6367.179 Mobile Safari/537.36";
const SAMSUNG_INTERNET =
  "Mozilla/5.0 (Linux; Android 14; SAMSUNG SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/24.0 Chrome/117.0.0.0 Mobile Safari/537.36";
const FACEBOOK_ANDROID =
  "Mozilla/5.0 (Linux; Android 12; SM-A125M Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.165 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/460.0.0.48.109;]";
const WINDOWS_CHROME =
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36";
const WINDOWS_EDGE =
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.2592.87";
const MAC_SAFARI =
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15";
const FIREFOX_ANDROID = "Mozilla/5.0 (Android 14; Mobile; rv:127.0) Gecko/127.0 Firefox/127.0";
const TABLET_ANDROID =
  "Mozilla/5.0 (Linux; Android 13; SM-X200) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36";

describe("lerAparelho", () => {
  it("iPhone no Safari", () => {
    assert.deepEqual(lerAparelho(IPHONE_SAFARI), {
      tipo: "celular",
      sistema: "iOS",
      versao: "17.5",
      navegador: "Safari",
      modelo: "iPhone",
      app: null,
      robo: false,
    });
  });

  it("iPhone dentro do Instagram: o app, e não o Safari por trás", () => {
    const aparelho = lerAparelho(IPHONE_INSTAGRAM);
    assert.equal(aparelho.app, "Instagram");
    assert.equal(aparelho.navegador, null);
    assert.equal(aparelho.versao, "17.4");
  });

  it("Android no Chrome com o modelo escondido: o modelo e a versão vêm das dicas", () => {
    const sem = lerAparelho(ANDROID_CHROME_REDUZIDO);
    assert.equal(sem.modelo, null);
    assert.equal(sem.versao, "10");
    const com = lerAparelho(ANDROID_CHROME_REDUZIDO, { modelo: "SM-A536E", versao: "14.0.0" });
    assert.equal(com.modelo, "Samsung SM-A536E");
    assert.equal(com.versao, "14");
    assert.equal(com.tipo, "celular");
    assert.equal(com.navegador, "Chrome");
  });

  it("Android dentro de um app (WebView): modelo do próprio agente, sem navegador", () => {
    const aparelho = lerAparelho(ANDROID_WEBVIEW);
    assert.equal(aparelho.modelo, "Motorola moto g(60)");
    assert.equal(aparelho.versao, "13");
    assert.equal(aparelho.navegador, null);
    assert.equal(aparelho.app, null);
  });

  it("Samsung Internet e Facebook", () => {
    const samsung = lerAparelho(SAMSUNG_INTERNET);
    assert.equal(samsung.navegador, "Samsung Internet");
    assert.equal(samsung.modelo, "Samsung SM-S918B");
    const facebook = lerAparelho(FACEBOOK_ANDROID);
    assert.equal(facebook.app, "Facebook");
    assert.equal(facebook.modelo, "Samsung SM-A125M");
  });

  it("computadores: Windows 11 só com a dica, Edge, Mac e iPad que se diz Mac", () => {
    assert.equal(lerAparelho(WINDOWS_CHROME).versao, null);
    const w11 = lerAparelho(WINDOWS_CHROME, { versao: "15.0.0" });
    assert.equal(w11.versao, "11");
    assert.equal(w11.tipo, "computador");
    assert.equal(lerAparelho(WINDOWS_CHROME, { versao: "10.0.0" }).versao, "10");
    assert.equal(lerAparelho(WINDOWS_EDGE).navegador, "Edge");
    const mac = lerAparelho(MAC_SAFARI);
    assert.equal(mac.sistema, "macOS");
    assert.equal(mac.navegador, "Safari");
    assert.equal(mac.tipo, "computador");
    const ipad = lerAparelho(MAC_SAFARI, { toques: 5 });
    assert.equal(ipad.tipo, "tablet");
    assert.equal(ipad.modelo, "iPad");
  });

  it("Firefox no Android e tablet Android", () => {
    const firefox = lerAparelho(FIREFOX_ANDROID);
    assert.equal(firefox.navegador, "Firefox");
    assert.equal(firefox.tipo, "celular");
    assert.equal(firefox.modelo, null);
    assert.equal(lerAparelho(TABLET_ANDROID).tipo, "tablet");
  });

  it("robôs não contam; celular com 'bot' no nome conta", () => {
    assert.equal(lerAparelho("Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)").robo, true);
    assert.equal(lerAparelho("facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)").robo, true);
    assert.equal(
      lerAparelho("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/126.0.0.0 Safari/537.36").robo,
      true
    );
    assert.equal(lerAparelho("").robo, true);
    assert.equal(
      lerAparelho("Mozilla/5.0 (Linux; Android 11; Cubot X30) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36").robo,
      false
    );
    assert.equal(lerAparelho(IPHONE_SAFARI).robo, false);
  });
});

describe("nomeDoModelo", () => {
  it("põe o fabricante na frente do código e ignora o modelo escondido", () => {
    assert.equal(nomeDoModelo("SM-A536E"), "Samsung SM-A536E");
    assert.equal(nomeDoModelo("SAMSUNG SM-A536E"), "Samsung SM-A536E");
    assert.equal(nomeDoModelo("moto g(60)"), "Motorola moto g(60)");
    assert.equal(nomeDoModelo("Redmi Note 12"), "Xiaomi Redmi Note 12");
    assert.equal(nomeDoModelo("Pixel 8"), "Google Pixel 8");
    assert.equal(nomeDoModelo("K"), null);
    assert.equal(nomeDoModelo(""), null);
    assert.equal(nomeDoModelo("Aparelho Qualquer"), "Aparelho Qualquer");
  });
});

describe("origemDoLink", () => {
  it("app do Android, sites conhecidos e a própria loja", () => {
    assert.equal(origemDoLink("android-app://com.whatsapp/"), "WhatsApp");
    assert.equal(origemDoLink("android-app://com.google.android.gm/"), "Gmail");
    assert.equal(origemDoLink("https://web.whatsapp.com/"), "WhatsApp");
    assert.equal(origemDoLink("https://l.instagram.com/?u=x"), "Instagram");
    assert.equal(origemDoLink("https://mail.google.com/mail/u/0/"), "Gmail");
    assert.equal(origemDoLink("https://ktalogu.com.br/metra", "ktalogu.com.br"), null);
    assert.equal(origemDoLink(""), null);
    assert.equal(origemDoLink("nao e endereco"), null);
  });
});
