/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * 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.
 */

#pragma once

#include <stdint.h>
#include <stdio.h>

#include <memory>
#include <string>
#include <string_view>

#include <ziparchive/zip_archive.h>

#include "edify/expr.h"
#include "edify/updater_interface.h"
#include "otautil/error_code.h"
#include "otautil/sysutil.h"

class Updater : public UpdaterInterface {
 public:
  explicit Updater(std::unique_ptr<UpdaterRuntimeInterface> run_time)
      : runtime_(std::move(run_time)) {}

  ~Updater() override;

  // Memory-maps the OTA package and opens it as a zip file. Also sets up the command pipe and
  // UpdaterRuntime.
  bool Init(int fd, const std::string_view package_filename, bool is_retry);

  // Parses and evaluates the updater-script in the OTA package. Reports the error code if the
  // evaluation fails.
  bool RunUpdate();

  // Writes the message to command pipe, adds a new line in the end.
  void WriteToCommandPipe(const std::string_view message, bool flush = false) const override;

  // Sends over the message to recovery to print it on the screen.
  void UiPrint(const std::string_view message) const override;

  std::string FindBlockDeviceName(const std::string_view name) const override;

  UpdaterRuntimeInterface* GetRuntime() const override {
    return runtime_.get();
  }
  ZipArchiveHandle GetPackageHandle() const override {
    return package_handle_;
  }
  std::string GetResult() const override {
    return result_;
  }

  uint8_t* GetMappedPackageAddress() const override {
    return mapped_package_.addr;
  }

 private:
  friend class UpdaterTestBase;
  friend class UpdaterTest;
  // Where in the package we expect to find the edify script to execute.
  // (Note it's "updateR-script", not the older "update-script".)
  static constexpr const char* SCRIPT_NAME = "META-INF/com/google/android/updater-script";

  // Reads the entry |name| in the zip archive and put the result in |content|.
  bool ReadEntryToString(ZipArchiveHandle za, const std::string& entry_name, std::string* content);

  // Parses the error code embedded in state->errmsg; and reports the error code and cause code.
  void ParseAndReportErrorCode(State* state);

  std::unique_ptr<UpdaterRuntimeInterface> runtime_;

  MemMapping mapped_package_;
  ZipArchiveHandle package_handle_{ nullptr };
  std::string updater_script_;

  bool is_retry_{ false };
  std::unique_ptr<FILE, decltype(&fclose)> cmd_pipe_{ nullptr, fclose };

  std::string result_;
  std::vector<std::string> skipped_functions_;
};
