// Copyright (C) 2026 SharpEmu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

using System.Runtime.InteropServices;

namespace SharpEmu.Core.Loader;

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public readonly struct ProgramHeader
{
    private readonly uint _type;
    private readonly uint _flags;
    private readonly ulong _offset;
    private readonly ulong _virtualAddress;
    private readonly ulong _physicalAddress;
    private readonly ulong _fileSize;
    private readonly ulong _memorySize;
    private readonly ulong _alignment;

    public uint Type => _type;

    public ProgramHeaderType HeaderType => (ProgramHeaderType)_type;

    public uint RawFlags => _flags;

    public ProgramHeaderFlags Flags => (ProgramHeaderFlags)_flags;

    public ulong Offset => _offset;

    public ulong VirtualAddress => _virtualAddress;

    public ulong PhysicalAddress => _physicalAddress;

    public ulong FileSize => _fileSize;

    public ulong MemorySize => _memorySize;

    public ulong Alignment => _alignment;
}

public enum ProgramHeaderType : uint
{
    Null = 0,

    Load = 1,

    Dynamic = 2,

    Tls = 7,

    SceRela = 0x60000000,

    SceProcParam = 0x61000001,

    SceDynLibData = 0x61000000,

    SceRelro = 0x61000010,
}

[Flags]
public enum ProgramHeaderFlags : uint
{
    None = 0,

    Execute = 0x1,

    Write = 0x2,

    Read = 0x4,
}
