var colors = {
  red: [
    "01",
    "02",
    "07",
    "08",
    "12",
    "13",
    "18",
    "19",
    "23",
    "24",
    "29",
    "30",
    "34",
    "35",
    "40",
    "45",
    "46",
  ],
  blue: [
    "03",
    "04",
    "09",
    "10",
    "14",
    "15",
    "20",
    "25",
    "26",
    "31",
    "36",
    "37",
    "41",
    "42",
    "47",
    "48",
  ],
  green: [
    "05",
    "06",
    "11",
    "16",
    "17",
    "21",
    "22",
    "27",
    "28",
    "32",
    "33",
    "38",
    "39",
    "43",
    "44",
    "49",
  ],
};
function getColor(num) {
  num = num.toString().padStart(2, "0");
  if (colors.red.includes(num)) {
    return "red";
  } else if (colors.blue.includes(num)) {
    return "blue";
  } else if (colors.green.includes(num)) {
    return "green";
  }
}

class LotteryLive {
  selector = ".lottery-live";
  element = null;
  headerElm = null;
  countdownElm = null;
  dataInit = {};
  socket = null;
  initOption = {
    headerClass: "next-container-header",
    countdownClass: "d-countdown",
  };
  timerCountdown = null;
  dataLottery = {};
  options = {};

  constructor(
    selector,
    options = {
      headerClass: "next-container-header",
      countdownClass: "d-countdown",
      onEndLive: () => { },
    }
  ) {
    this.selector = selector;
    this.element = $(selector);
    this.init();
    this.bindOptions({
      ...this.initOption,
      ...options
    });
    this.render();
  }

  init() {
    this.element.html(`
          <div class="next-container-header"></div>
          <div class="next-container-body">
        <div class="flex align-center">
          <div class="flex-1 curNoResult"></div>
          <div class="flex-time-box">
            <div class="count-box">
              <div class="d-countdown"></div>
            </div>
            <div class="btn-gruop-box">
              <div class="btn-gruop">
                <a
                  href="https://tk${subdomain}.xn--v1bar0a7grbxa4db6k.xn--i1b6b1a6a2e"
                  target="_blank"
                  class="ss-btn"
                  style="color:#fff;background-color:#dc9c0f"
                >
                  600图库
                </a>
                <a href="video.html" class="ss-btn ss-btn-error">
                  直播
                </a>
              </div>
              <a href="history.html" class="more-link">
                歷史開獎查詢 <span class="arrow-right"></span>
              </a>
            </div>
          </div>
        </div>
      </div>`);
    this.connectSocket();
  }
  connectSocket() {
    const socket = new io('https://ws.edgoapp.com', {transports: ['websocket']});
    // const socket = new io('ws://ws.edgoapp.com', {
    //     transports: ['websocket'],
    //     secure: false,
    // });
    socket.on("connect", function () {
      console.log("connected");
    });
    socket.on("disconnect", function () {
      console.log("disconnect");
    });
    socket.on("notification", this.socketOnNotification.bind(this));
    socket.on("amloto", this.socketOnAmloto.bind(this));
    this.socket = socket;
  }
  socketOnNotification(data) {
    let numsAm = data?.["2"];
    this.dataLottery.day = numsAm.day;
    let numsAmKj = data?.["2kj"]?.k.split(",");
    this.dataLottery.no = numsAm[0];
    if (!numsAm.hasOwnProperty("p1")) {
      numsAm = Object.values(numsAm).slice(1, 8);
    } else {
      numsAm = numsAmKj.slice(1, 8);
    }
    this.dataLottery.numbers = numsAm
    this.dataLottery.no = numsAmKj[0];
    this.renderResultBox();
  }
  socketOnAmloto(data) {
    const [no, p1, p2, p3, p4, p5, p6, t, nextPeriod] = data;
    const numbers = [p1, p2, p3, p4, p5, p6, t]
    this.dataLottery = {
      ...this.dataLottery,
      no,
      nextPeriod,
      numbers,
    };
    this.dataLottery.day = new Date();
    this.renderResultBox();
    if (this.options.onEndLive && numbers.every((num) => parseInt(num))) {
      this.options.onEndLive({
        no,
        numbers,
      });
    }
  }
  bindOptions(options) {
    const { headerClass, countdownClass = "d-countdown" } = options;
    this.headerElm = this.element.find(`.${headerClass}`);
    this.countdownElm = this.element.find(`.${countdownClass}`);
    this.options = options;
  }

  render() {
    this.renderHeader();
    this.renderCountdown();
  }

  renderHeader() {
    this.headerElm.html(`
        <span class="fr">
       第<span class="nxtNo"></span>期截至時間：<span class="nxtTime"></span>
        </span>
        <div class="fr mobile-fr">
          <div class="lottery-issue">
            第 <span class="color-error nxtNo"></span> 期
          </div>
          <div class="next-open-time">
            <p class="text">下期截止時間</p>
            <p class="time"></p>
          </div>
        </div>
        澳門官方六合彩
      `);
  }
  renderResultBox() {
    const resultBox = this.element.find(".curNoResult");
    const { no, numbers } = this.dataLottery;
    const now = this.dataLottery.day ? new Date(this.dataLottery.day) : new Date();
    const year = now.getFullYear();
    const month = now.getMonth() + 1;
    const day = now.getDate();

    const numbersHtml = numbers
      .map((num) => {
        return `<div class="item"><span class="${getColor(num)}">${isNaN(parseInt(num)) || parseInt(num) === 0 ? num : num.toString().padStart(2, "0")}</span>
                <p>${this.getXIAO(num, `${year}-${month.toString().padStart(2, "0")}-${day.toString().padStart(2, "0")}`)}</p>
            </div>`;
      })
      .join("");

    resultBox.html(
      `<div class="lottery-issue"><span class="bold">澳門六合彩</span><span>第<span class="color-error">${no}</span>期</span>
      </div>
      <div class="winning-numers winning-numers-large winning-numers-plus">
           ${numbersHtml}
      </div>`
    );
  }

  renderCountdown() {
    const nowUtc8 = new Date(new Date().toLocaleString("en-US", { timeZone: "Asia/Macau" }));
    let timeOpen = new Date(new Date().setHours(21, 30, 0, 0));
    let timeDiff = timeOpen - nowUtc8;
    if (timeDiff < 0) {
      if (timeDiff < -1000 * 60 * 5) {
        timeOpen = new Date(new Date().setHours(21, 30, 0, 0) + 1000 * 60 * 60 * 24);
        timeDiff = timeOpen - nowUtc8;
      } else {
        timeDiff = 0
      }
    }

    const hoursDiff = Math.floor(timeDiff / 1000 / 60 / 60);
    const minutesDiff = Math.floor((timeDiff / 1000 / 60) % 60);
    const secondsDiff = Math.floor((timeDiff / 1000) % 60);
    const countdownTimeString = `${this.formatTimeToString(
      hoursDiff
    )}:${this.formatTimeToString(minutesDiff)}:${this.formatTimeToString(
      secondsDiff
    )}`;

    const countdownHtml = countdownTimeString
      .split("")
      .map((item) => {
        return `<span class="count-item">${item}</span>`;
      })
      .join("");


    this.countdownElm.html(countdownHtml);
    clearTimeout(this.timerCountdown);
    this.timerCountdown = setTimeout(() => {
      this.renderCountdown();
    }, 1000);
  }
  formatTimeToString(time) {
    return Math.floor(time).toString().padStart(2, "0");
  }
  getXIAO(num, date) {
    let lunayear = AnimalsHelper.getYearLunar(date);
    AnimalsHelper.addYear(lunayear);
    num = parseInt(num);
    if (num > 0 && num < 50) {
      return AnimalsHelper.getHMSHENGXIAO(
        num > 9 ? num.toString() : num == 0 ? 0 : "0" + num.toString(),
        date
      );
    } else {
      return "發";
    }
  }
  getColor(num) {
    num = num.toString().padStart(2, "0");
    if (colors.red.includes(num)) {
      return "red";
    } else if (colors.blue.includes(num)) {
      return "blue";
    } else if (colors.green.includes(num)) {
      return "green";
    }
  }
  addDate(days) {
    const date = new Date();
    date.setDate(date.getDate() + days);
    return date;
  }
}



class LotteryHistory {
  options = null
  data = []
  lotterytWatch = null
  constructor(element, options) {
    this.element = $(element);
    this.options = options;
    this.init();
  }
  init() {
    this.renderInit()
    this.fetchHistory();
  }
  renderInit() {
    this.element.html(
      `<div class="recent-container" style="margin-bottom:0">
      <ul class="recent-box">
      </ul>
      <div class="video-trace__wrapper" style="display:none">
      </div>
    </div>`);
  }
  renderHistory() {
    const header = ` <li class="flex align-center"><span>期號</span><span>開獎時間</span><span class="flex-1">中獎號碼</span><span>開獎回放</span> </li>`
    const data = this.data.sort((a, b) => b.no - a.no);

    const html = data.map((item) => {
      const numbers = [item.p1, item.p2, item.p3, item.p4, item.p5, item.p6, item.t]
      return `
        <li class="flex align-center"><span>第 <span class="color-error">${item.no}</span>
          期</span><span>${item.day}</span><span class="flex-1">
            <div class="winning-numers winning-numers-default winning-numers-plus">
              ${this.getHtmlNumbers(numbers, item.day)}
            </div>
          </span><span>
            <div class="video-button" data-no="${item.no}">回放</div>
          </span></li>`
    }).join("")
    const box = this.element.find(".recent-box")
    box.html(header + html)
    this.bindPlay()
  }
  bindPlay() {
    const btn = this.element.find(".video-button");
    btn.on("click", (e) => {
      const no = $(e.currentTarget).data("no");
      this.lotterytWatch = this.data.find((item) => item.no == no);
      this.renderVideoPopup();
    });
  }
  getHtmlNumbers(numbers, day) {
    return numbers
      .map((num) => {
        return `<div class="item"><span class="${getColor(num)}">${isNaN(parseInt(num)) || parseInt(num) === 0 ? num : num.toString().padStart(2, "0")}</span>
                <p>${this.getXIAO(num, day)}</p>
            </div>`;
      })
      .join("");
  }
  fetchHistory = () => {
    $.ajax({
      url: "https://tkapi3.352722.com/static/draws/am_kj.json?"
    }).done((res) => {
      const data = res.data;
      this.setHistory(data?.slice(0, 5) || []);
      this.renderHistory();
    }).fail((err) => {
      console.log(err);
    });
  }
  addToHistory(data) {
    const isExist = this.data.find((item) => item.no === data.no);
    if (isExist) {
      return;
    }
    this.data.push(data);
    this.renderHistory();
  }
  setHistory(data) {
    this.data = data;
  }
   getXIAO(num, date) {
    let lunayear = AnimalsHelper.getYearLunar(date);
    AnimalsHelper.addYear(lunayear);
    num = parseInt(num);
    if (num > 0 && num < 50) {
      return AnimalsHelper.getHMSHENGXIAO(
        num > 9 ? num.toString() : num == 0 ? 0 : "0" + num.toString(),
        date
      );
    } else {
      return "發";
    }
  }
  renderVideoPopup() {
    const videoPopup = this.element.find(".video-trace__wrapper");
    videoPopup.css({
      display: "block",
    })
    videoPopup.html(this.getVideoPopupHtml());
    const closeBtn = videoPopup.find(".video-close");
    closeBtn.on("click", () => {
      videoPopup.css({
        display: "none",
      });
    });
  }
  getVideoPopupHtml() {
    const his = this.lotterytWatch
    const numbers = [his.p1, his.p2, his.p3, his.p4, his.p5, his.p6, his.t]
    const day = his.day
    return `<div role="dialog" aria-modal="true" class="video-trace">
    <div class="video-trace__head"><span class="videoName">澳門六合彩</span><span
            class="videoIssue">第<span>${his.no}</span> 期</span><span class="videoTitle">回放</span>
        <div class="videoMessage">
            <div class="videoTime">開獎時間：${his.day}</div>
            <div class="videoCode">
                <div class="winning-numers winning-numers-default winning-numers-plus">
                    ${this.getHtmlNumbers(numbers, day)}
                </div>
            </div>
        </div>
      <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsSAAALEgHS3X78AAACd0lEQVRIx7WXSU9UURCFv/NkNii4MIIChogEjAYNhoXBaIIEFiYa4z80rl05gIlDcFgYFUWjIu2UCK4QUcCgfVz0e9pNut+AzVl131uvvlfVdavripSy3QG0A7uAncCOcGsZWAIWgQVJ79L4UwrgANAXAtNoCXgFTEtazwy23QUMh9FtRivAlKTZ1GDbQ8DgJoEbNSPpTiLY9kngcJWgkXKSrhUvBGUirTYUoNv26bJg2+1UL73l1G+7p1zEY1sIjTRiu/Yv2PYRoDHmgSUgn9L5YsxeABwvjvhYnCNJl4ArKaCTki4DCzE2A7YV2N4HbI8xrLfdKWkemIixm5L0xvbuhOwJOBAAnQlRNAFnbfeEzaAc/J6k6bBAL5LcdLprgJYUKQQYtZ2XNGs7z79inCqCnk/pqyULGGDM9kQIfwDUhdC2DFCAphqgOcMDUeTNkh4D2O4FRjL6qA0yPhCpvuhz3WYc1ADfyZbu6DftBeolPbP9AxjP4GM9oNAc0iqq3j0U0jtsu1tSDriZwc9qAHzNEOnTsHovFK2P2z4o6TVwPaWvbwHwKcFoDbgVRrqX8tV7Jjznc8BVCkNAnHKBpA+h80pakfTSditwLsZu1HZHOHMlZXFWALYHgaEYw3mgFWhIcPgb+EJhKKykF5JuBwCSHgG/YozbUkABtiVAAR5C6f/xZArH/6u7ktZKwOGRmNlCaE7S8+hLSecKp8G5LYB+3jjsVRpvTwGHqgR9K+nGxsW4gb4POEFpX86iPHBf0nS5zdgrjO0G4CjQT7qqBlincIV5Imm5klHi3Sl8gVpgP9BF4Tw3Fr3IT2CVQtP4CLyPKjdOfwCD1OXshuZzsgAAAABJRU5ErkJggg==" alt="" class="video-close close">
    </div><video src="https://video.664460.com/video/${his.year}/${his.no}.mp4" autoplay="autoplay"></video>
</div>`
  }

}
