/*
 * Copyright 2022 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 <android-base/logging.h>
#include <android-base/unique_fd.h>
#include <xf86drm.h>
#include <xf86drmMode.h>

#include <cstdint>
#include <memory>

#include "Common.h"

namespace aidl::android::hardware::graphics::composer3::impl {

class DrmMode {
   public:
    static std::unique_ptr<DrmMode> create(::android::base::borrowed_fd drmFd,
                                           const drmModeModeInfo& info);

    ~DrmMode();

    const uint32_t clock;
    const uint16_t hdisplay;
    const uint16_t hsync_start;
    const uint16_t hsync_end;
    const uint16_t htotal;
    const uint16_t hskew;
    const uint16_t vdisplay;
    const uint16_t vsync_start;
    const uint16_t vsync_end;
    const uint16_t vtotal;
    const uint16_t vscan;
    const uint32_t vrefresh;
    const uint32_t flags;
    const uint32_t type;
    const std::string name;

    uint32_t getBlobId() const { return mBlobId; }

   private:
    DrmMode(const drmModeModeInfo& info, uint32_t blobId)
        : clock(info.clock),
          hdisplay(info.hdisplay),
          hsync_start(info.hsync_start),
          hsync_end(info.hsync_end),
          htotal(info.htotal),
          hskew(info.hskew),
          vdisplay(info.vdisplay),
          vsync_start(info.vsync_start),
          vsync_end(info.vsync_end),
          vtotal(info.vtotal),
          vscan(info.vscan),
          vrefresh(info.vrefresh),
          flags(info.flags),
          type(info.type),
          name(info.name),
          mBlobId(blobId) {}

    const uint32_t mBlobId;
};

}  // namespace aidl::android::hardware::graphics::composer3::impl
