#!/bin/bash

######################################################################
# @author      : yetist (yetist@yetipc)
# @file        : mkwineapp
# @created     : 星期五 11月 18, 2022 22:15:53 CST
#
# @description : 从.wine容器生成可安装的app目录
######################################################################
#set -x 

FAKE_USER="@current_user@"

prefix_dir=`realpath $1`
name=`basename $prefix_dir`
start_dir=`mktemp -d /tmp/winapp.XXXX`
app_dir="/tmp/winapp.${name}"
pkg_date=`date +%Y%m%d`
tarballs=$name-$pkg_date.tar.zst

usage()
{
  echo $0 "<WINE_PREFIX_DIRECTORY>"
  echo "or:"
  echo $0 "<WINE_PREFIX_DIRECTORY>" "<SRC_DIRECTORY>"
  echo -e "<SRC_DIRECTORY>:Including the follow files,eg:foobar2000:\n  icons(eg:48.png) foobar2000.desktop foobar2000.metainfo DEBIAN/control"
  exit 0
}

get_win_user()
{
  local prefix=$1
  local users len user
  users=$(ls $prefix/drive_c/users)
  users=( ${users[@]/Public/} )
  len=${#users[@]}
  if [ $len -eq 1 ]; then
    user=${users[0]}
  fi

  if [ "x$user" != "x$FAKE_USER" ]; then
    echo $user
  elif [ -f $prefix/user.reg ]; then
    grep USERNAME $prefix/user.reg | awk -F= '{print $2}' |sed 's/"//g'
  else
    echo $USER
  fi
}

echo `get_win_user $*`

clean()
{
  local prefix=$1
  local win_user=`get_win_user $prefix`

  # regedit
  for i in system userdef user; do
    sed -i "s#home\\\\\\\\${win_user}#home\\\\\\\\${FAKE_USER}#g" $prefix/$i.reg
    sed -i "s#users\\\\\\\\${win_user}#users\\\\\\\\${FAKE_USER}#g" $prefix/$i.reg
    sed -i "s#home/${win_user}#home/${FAKE_USER}#g" $prefix/$i.reg
    sed -i "s#users/${win_user}#users/${FAKE_USER}#g" $prefix/$i.reg
    sed -i "s#home\\\\\\\\${USER}#home\\\\\\\\${FAKE_USER}#g" $prefix/$i.reg
    sed -i "s#users\\\\\\\\${USER}#users\\\\\\\\${FAKE_USER}#g" $prefix/$i.reg
    sed -i "s#home/${USER}#home/${FAKE_USER}#g" $prefix/$i.reg
    sed -i "s#users/${USER}#users/${FAKE_USER}#g" $prefix/$i.reg
  done
  sed -i "s#\"USERNAME\"=\"$win_user\"#\"USERNAME\"=\"$FAKE_USER\"#" $prefix/user.reg
  sed -i "s#\"USERNAME\"=\"$USER\"#\"USERNAME\"=\"$FAKE_USER\"#" $prefix/user.reg

  # clean c:\users
  rm -rf $prefix/drive_c/users/*
#  for i in "Desktop" "Documents" "Downloads" "Music" "Pictures" "Videos" \
#    "Temp" "Searches" "Saved Games" "Links" "Contacts" "Favorites" "AppData"; do
#    if [ -d "$prefix/drive_c/users/$win_user/$i" ]; then
#      rm -rf "$prefix/drive_c/users/$win_user/$i"
#    elif [ -L "$prefix/drive_c/users/$win_user/$i" ]; then
#      rm -f "$prefix/drive_c/users/$win_user/$i"
#    fi
#  done

  # clean c:\windows
  for i in Installer temp; do
    if [ -d $prefix/drive_c/windows/$i ]; then
      rm -rf $prefix/drive_c/windows/$i/*
    fi
  done

  for i in .update-timestamp winetricks.log app_version pkg_version; do
    if [ -f $prefix/${i} ]; then
      rm -f $prefix/${i}
    fi
  done

    # remove dosdevices directory
  if [ -d $prefix/dosdevices ]; then
    rm -rf $prefix/dosdevices
  fi

  if [ -d "$prefix/drive_c/ProgramData" ]; then
    if [ "$name" = "dreamwaver" ] || [ "$name" = "wechat" ];then
      echo "Preserve ProgramData"
      return
    else
      rm -rf $prefix/drive_c/ProgramData/*
    fi
    #rm -rf $prefix/drive_c/ProgramData/*
  fi

  if [ -d $prefix/drive_c/users/$win_user ]; then
    mv $prefix/drive_c/users/$win_user $prefix/drive_c/users/$FAKE_USER
  fi
}

#if [ $# -ne 2 ];then
#  usage
#fi

if [ $# -gt 2 ] || [ $# -eq 0 ];then
  usage
fi


if [ ! -d $prefix_dir/drive_c ]; then
  exit
fi

cp -a $prefix_dir $start_dir

clean $start_dir/$name

( cd $start_dir/$name; tar --zstd -cf $start_dir/$tarballs *)

cat > $start_dir/$name.metainfo << EOF
# vim: set ft=sh:
# App 名称
APP_NAME="$name"
# App 中文名称,首次启动时需要显示
APP_NAME_CN="$name"
# App 版本号
APP_VERSION="1.0"
# App 压缩包文件名
APP_ARCHIVE="$tarballs"
# App 版本升级时需要忽略的文件列表
APP_IGNORE=".appignore"
# App 运行时需要进入的路径
APP_RUN_PATH="drive_c/"
# App 运行命令
APP_RUN_CMD=""
# App 运行时使用的 wine 版本号，当需要使用与默认wine不同的版本时需要指定。
APP_RUN_WINE=""
EOF

cat > $start_dir/$name.desktop << EOF
[Desktop Entry]
Name=$name
Name[zh_CN]=$name
Comment=$name
Comment[zh_CN]=$name
Exec=$name
Type=Application
StartupNotify=true
Terminal=false
Icon=$name
Categories=Game;
StartupWMClass=$name.exe
EOF

mkdir $start_dir/DEBIAN/
cat > $start_dir/DEBIAN/control << EOF
Package: $name
Version: 1.0 
Architecture: loongarch64
Maintainer: loongson <loongson@loongson.cn>
Section: interpreters
Priority: optional
Homepage: http://loongson.cn/
Description: 
EOF

cat > $start_dir/DEBIAN/postrm << EOF
#!/bin/bash

BOTTLE_NAME="$name"

doremove()
{
    if [[ -n "\$BOTTLE_NAME" ]];then
        bottle_path="/home/\$(logname)/.local/share/wineprefixes/\${BOTTLE_NAME}"
        if [ -d "\$bottle_path" ];then
            rm -rf "\$bottle_path"
            echo "rm \$bottle_path"
        fi
    fi
}

case \$1 in
    "remove")
        echo "normal remove me"
        doremove
        ;;
    "purge")
        echo "purge"
        doremove
        ;;
    "upgrade")
        #if [[ -n "\$BOTTLE_NAME" ]];then
        #  bottle_path="/home/\$(logname)/.local/share/wineprefixes/\${BOTTLE_NAME}"
        #  if [ -f "\$bottle_path/app_version" ] && [ "\$(cat "\$bottle_path/app_version")" = "\$2" ];then
        #    rm -rf "\$bottle_path"
        #    echo "reinstall"
        #    echo "rm \$bottle_path"
        #  else
        #    echo "Old: upgrade to \$2"
        #  fi
        #fi
        echo "Old: upgrade to \$2"
        ;;
    *)
        echo "unkown action"
        ;;
esac

# Make sure the script returns 0
true
EOF

src_dir=$2

package() {
  mkdir -p ${app_dir}/{DEBIAN,opt/wine-apps/$name,usr/{bin,share/{applications,icons/hicolor}}}
  touch ${start_dir}/app_ignore
  cat > ${start_dir}/app_ignore << EOF
user.reg
userdef.reg
system.reg
EOF
  cp  ${start_dir}/app_ignore                ${app_dir}/opt/wine-apps/$name/.appignore
  cp  ${start_dir}/$name-$pkg_date.tar.zst  ${app_dir}/opt/wine-apps/$name/$name.tar.zst
  cp  ${src_dir}/$name.metainfo ${app_dir}/opt/wine-apps/$name/$name.metainfo
  cp  ${src_dir}/$name.desktop  ${app_dir}/usr/share/applications/$name.desktop
  cp  ${start_dir}/DEBIAN/postrm                ${app_dir}/DEBIAN/
  chmod 755 ${app_dir}/DEBIAN/postrm
  cp  ${src_dir}/DEBIAN/control                ${app_dir}/DEBIAN/
  ln -sf /usr/bin/wine-run                          ${app_dir}/usr/bin/$name
  if [ -d $src_dir/lib ];then
    cp -a $src_dir/lib ${app_dir}/opt/wine-apps/$name/
  fi
  for i in 16 24 32 48 64 96 128 256; do
    if [ -f $src_dir/$i.png ]; then
      mkdir -p ${app_dir}/usr/share/icons/hicolor/${i}x${i}/apps/
      cp ${src_dir}/${i}.png        ${app_dir}/usr/share/icons/hicolor/${i}x${i}/apps/$name.png
    fi
  done
  echo "Use dpkg-deb to package in $app_dir"
  cd $app_dir
  #ver=`cat ${app_dir}/opt/wine-apps/$name/$name.metainfo | grep APP_VERSION | awk -F= '{print $2}' | sed 's/"//g'`
  ver=`cat ${app_dir}/DEBIAN/control | grep Version | awk -F' ' '{print $2}'`
  echo $name
  echo $ver
  arch=`cat ${app_dir}/DEBIAN/control | grep Architecture | awk -F' ' '{print $2}'`
  dpkg-deb -b . ../${name}_${ver}_${arch}.deb 
  echo "Binary Package is in /tmp"
}

if [ ! -z $src_dir ];then
  package
  rm -rf $start_dir
else
  mv $start_dir $app_dir
  echo "The app develop files is $app_dir"
fi

#mv $start_dir $app_dir
