import hipparcos_catalog from "./hipparcos_7_concise.js";
import CatalogSkybox from "./CatalogSkybox.js";
//  20240814  blitheli

/**
 * 由hipparcos星表数据生成天空盒子的一个面的图片
 * 
 * 通过Canvas绘制,纯黑色背景,行星为白色,大小和亮度与星等相关
 * 
 * 用户可以通过这个函数生成天空盒子的6个面的图片,然后通过Cesium的SkyBox类创建自定义的天空盒
 * 
 * 目前数据为hipparcos星表数据(仅考虑星等7以上亮度):./hipparcos_7_concise.js
 *    来源: https://github.com/gmiller123456/hip2000
 * 可根据需要自行下载和替换数据
 * 
 * @param {number} faceId0 立方体盒子的面id,0: mx, 1: my, 2: px, 3: py, 4: pz, 5: mz
 * @param {number} width 图片的宽度(高度也是这个值),单位:像素 
 * @returns base64格式的图片(png)
 */
function createSkyboxImage(faceId0, width) {
  //  恒星亮度(等级),亮度等级越小,亮度越大
  const magBright = -1;
  const magMedium = 7;
  const magDim = 12;
  //  恒星大小,单位像素
  const sizeBright = 5;
  const sizeMedium = 1;
  const sizeDim = 0.1;
  //  恒星透明度(1为不透明,0为透明)
  const translucentBright = 1.0;
  const translucentMedium = 0.75;
  const translucentDim = 0.2;

  const d2r = Math.PI / 180;

  //  创建width*width的jpg格式的图片,背景为黑色,随机生成1000个像素点,颜色为白色,大小从1到5像素不等
  var canvas = document.createElement("canvas");
  canvas.width = width;
  canvas.height = width;
  var context = canvas.getContext("2d");
  //  黑色背景
  context.fillStyle = "black";
  context.fillRect(0, 0, width, width);

  //  循环hipparcos数据,hipparcos_catalog为数组
  for (var id = 0; id < hipparcos_catalog.length; id++) {
    var star = hipparcos_catalog[id];
    var mag = star[1];
    var ra = star[2];
    var dec = star[3];

    //  赤经原始为0-360°,需要转换为[-180,180]°
    if (ra > 180) {
      ra = ra - 360;
    }
    // 赤经赤纬转换为弧度
    ra = ra * d2r;
    dec = dec * d2r;

    //  赤经、赤纬转换为立方盒子坐标,再转换为图片坐标
    let { x, y, z } = CatalogSkybox.sphere2CubeXyz(ra, dec);

    //  转换为图片坐标(i,为横坐标,向右,[0,1]), (j为纵坐标,向下,[0,1])
    let { i, j, faceId } = CatalogSkybox.cubeXyzToImgUV(x, y, z);

    //  不是当前盒子面的点,不绘制,直接跳过
    if (faceId !== faceId0) {
      continue;
    }

    //  像素大小、透明度(根据星等,按照最大值和最小值线性插值)
    let size = sizeBright;  //  默认最大值
    let translucent = translucentBright;
    if (mag > magBright && mag <= magMedium) {
      size =
        sizeMedium +
        ((sizeBright - sizeMedium) * (mag - magMedium)) /
          (magBright - magMedium);
      translucent =
        translucentMedium +
        ((translucentBright - translucentMedium) * (mag - magMedium)) /
          (magBright - magMedium);
    }
    //  亮度太暗,设最小值
    else if (mag > magMedium) {
      size = sizeDim;
      translucent = translucentDim;
    }

    //  图像坐标系下的坐标(考虑到图片的大小,精确到实际的像素坐标)
    let u = i * width - size / 2;
    let v = j * width - size / 2;
    if (u < 0) {
      u = 0;
    }
    if (v < 0) {
      v = 0;
    }

    //  画点,白色,带透明度
    context.fillStyle = `rgba(255,255,255,${translucent})`;
    context.fillRect(u, v, size, size);
  }

  //  生成base64格式的图片
  var dataUrl = canvas.toDataURL("image/jpeg");
  return dataUrl;

}

export default createSkyboxImage;