# Build an Ubuntu-based container to run Mycroft
#
#   The steps in this build are ordered from least likely to change to most
#   likely to change.  The intent behind this is to reduce build time so things
#   like Jenkins jobs don't spend a lot of time re-building things that did not
#   change from one build to the next.
#
FROM ubuntu:18.04 as core_builder
ARG platform
ENV TERM linux
ENV DEBIAN_FRONTEND noninteractive
# Un-comment any package sources that include a multiverse
RUN sed -i 's/# \(.*multiverse$\)/\1/g' /etc/apt/sources.list
# Install Server Dependencies for Mycroft
RUN apt-get update && apt-get install -y \
    autoconf \
    automake \
    bison \
    build-essential \
    curl \
    flac \
    git \
    jq \
    libfann-dev \
    libffi-dev \
    libicu-dev \
    libjpeg-dev \
    libglib2.0-dev \
    libssl-dev \
    libtool \
    locales \
    mpg123 \
    pkg-config \
    portaudio19-dev \
    pulseaudio \
    pulseaudio-utils \
    python3 \
    python3-dev \
    python3-pip \
    python3-setuptools \
    python3-venv \
    screen \
    sudo \
    swig \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Set the locale
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

ENV USER root
ENV CI true
# Setup the virtual environment
#   This may not be the most efficient way to do this in terms of number of
#   steps, but it is built to take advantage of Docker's caching mechanism
#   to only rebuild things that have changed since the last build.
RUN mkdir -p /opt/mycroft/mycroft-core /opt/mycroft/skills /root/.mycroft /var/log/mycroft
RUN python3 -m venv "/opt/mycroft/mycroft-core/.venv"

# Install required Python packages.  Generate hash, which mycroft core uses to
# determine if any changes have been made since it last started
WORKDIR /opt/mycroft/mycroft-core
RUN .venv/bin/python -m pip install pip==20.0.2
COPY requirements/requirements.txt .
RUN .venv/bin/python -m pip install -r requirements.txt
COPY requirements/extra-audiobackend.txt .
COPY requirements/extra-stt.txt .
COPY requirements/extra-mark1.txt .
RUN .venv/bin/python -m pip install -r extra-audiobackend.txt \
    && .venv/bin/python -m pip install -r extra-stt.txt \
    && .venv/bin/python -m pip install -r extra-mark1.txt
COPY requirements/tests.txt .
RUN .venv/bin/python -m pip install -r tests.txt
COPY dev_setup.sh .
RUN md5sum requirements.txt tests.txt extra-audiobackend.txt extra-stt.txt extra-mark1.txt dev_setup.sh > .installed

# Add the mycroft core virtual environment to the system path.
ENV PATH /opt/mycroft/mycroft-core/.venv/bin:$PATH

# Install Mark I default skills
RUN msm -p mycroft_mark_1 default
COPY . /opt/mycroft/mycroft-core
RUN .venv/bin/python -m pip install --no-deps /opt/mycroft/mycroft-core
EXPOSE 8181


# Integration Test Suite
#
#   Build against this target to set the container up as an executable that
#   will run the "voight_kampff" integration test suite.
#
FROM core_builder as voight_kampff_builder
ARG platform
# Setup a dummy TTS backend for the audio process
RUN mkdir /etc/mycroft
RUN echo '{"tts": {"module": "dummy"}, "skills": {"auto_update": false}}' > /etc/mycroft/mycroft.conf
RUN mkdir ~/.mycroft/allure-result

# The behave feature files for a skill are defined within the skill's
# repository.  Copy those files into the local feature file directory
# for test discovery.
WORKDIR /opt/mycroft/mycroft-core
# Generate hash of required packages
RUN python -m test.integrationtests.voight_kampff.test_setup -c test/integrationtests/voight_kampff/default.yml

# Setup and run the integration tests
ENV PYTHONPATH /opt/mycroft/mycroft-core/
WORKDIR /opt/mycroft/mycroft-core/test/integrationtests/voight_kampff
ENTRYPOINT ["./run_test_suite.sh"]
