# escape=`

# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
ARG FROM_IMAGE
FROM ${FROM_IMAGE}

SHELL ["powershell", "-ExecutionPolicy", "Unrestricted", "-Command", `
       "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

# Helper script for quick delete operations in windows
COPY ./fast-win-rmdir.cmd /fast-win-rmdir.cmd

# Pin Choco to 1.4.0 to avoid required reboot in 2.0.0
ENV chocolateyVersion '1.4.0'
# Install deps via chocolatey.
RUN iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'));`
    mkdir C:\choco-cache;`
    # Note: We pinned python 3.11.0 version here because 3.11.2 has a regression
    # where the install arguments like TargetDir were being ignored.
    choco install -y -c C:\choco-cache python3 --version 3.11.0 -ia '/quiet InstallAllUsers=1 PrependPath=1 TargetDir="C:\Python3"';`
    choco install -y -c C:\choco-cache winflexbison3 --params '/InstallDir:C:\bison';`
    choco install -y -c C:\choco-cache ninja;`
    choco install -y -c C:\choco-cache nodejs-lts;`
    choco install -y -c C:\choco-cache git;`
    choco install -y -c C:\choco-cache cmake --installargs 'ADD_CMAKE_TO_PATH=System';`
    choco install -y -c C:\choco-cache nasm;`
    Write-Host ('Deleting the chocolately download cache');`
    Remove-Item -Force -Recurse $env:TEMP\*;`
    C:\fast-win-rmdir.cmd C:\choco-cache;`
    # Create version specific copy of each python executable.
    Copy-Item C:\Python3\python.exe C:\Python3\python3.exe

# Configure PATH for nasm.
RUN setx /M PATH $($Env:PATH + ';C:\Program Files\NASM')

# Install python3 packages via PIP and set various configurations.
COPY ./requirements.txt /requirements.txt
RUN mkdir C:\pip-cache;`
    python3 -m pip install --require-hashes --no-deps -r /requirements.txt --cache-dir C:\pip-cache;`
    C:\fast-win-rmdir.cmd C:\pip-cache;`
    # Configure git global settings.
    git config --global core.autocrlf false;`
    git config --global core.symlinks false;`
    git config --global core.filemode false;`
    git config --global core.preloadindex true;`
    git config --global core.fscache true;`
    git config --global --add safe.directory C:/code;`
    # Registry changes to enable long filesystem paths.
    reg add 'HKLM\SYSTEM\CurrentControlSet\Control\FileSystem' /v LongPathsEnabled /t REG_DWORD /reg:64 /d 1 /f;`
    reg add 'HKLM\SYSTEM\CurrentControlSet\Control\FileSystem' /v LongPathsEnabled /t REG_DWORD /d 1 /f;`
    # Environment variables
    # This fixes a bug running python scripts "LookupError: unknown encoding: cp0".
    cmd /S /C setx /M PYTHONIOENCODING 'UTF-8';`
    # This ensures GYP does not generate PDB files, or create symlinks during build.
    cmd /S /C setx /M IS_DOCKER '1'

# Setup Sccache
ADD https://storage.googleapis.com/cobalt-docker-resources/sccache-0.2.16-alpha.0.exe /sccache/sccache.exe
RUN mkdir C:\root\sccache;`
    setx /M PATH $($Env:PATH + ';C:\sccache')

# Set up GN
RUN (New-Object Net.WebClient).DownloadFile(`
    'https://chrome-infra-packages.appspot.com/dl/gn/gn/windows-amd64/+/ur-MX9ARZXAVL1MusvU3v4YebmmerRPLDsJQrTLvN1cC',`
    'C:\gn.zip') ; `
    Expand-Archive -Force C:\gn.zip C:\gn\ ; `
    Remove-Item -Path C:\gn.zip ; `
    setx /M PATH $($Env:PATH + ';C:\gn')

# Configure common env vars.
ENV NINJA_STATUS="[%e sec | %f/%t %u remaining | %c/sec | j%r] "
