using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cosmos.Common.Extensions;

namespace Cosmos.Hardware.BlockDevice {
  // Its not a BlockDevice, but its related to "fixed" devices
  // and necessary to create partition block devices
  // Im not comfortable with MBR and Partition being in Hardware ring and would prefer
  // them in the system ring, but there are issues relating to moving it there.
  public class MBR {
    // TODO Lock this so other code cannot add/remove/modify the list
    // Can make a locked list class which wraps a list<>
    public List<PartInfo> Partitions = new List<PartInfo>();

    public class PartInfo {
      public readonly byte SystemID;
      public readonly UInt32 StartSector;
      public readonly UInt32 SectorCount;

      public PartInfo(byte aSystemID, UInt32 aStartSector, UInt32 aSectorCount) {
        SystemID = aSystemID;
        StartSector = aStartSector;
        SectorCount = aSectorCount;
      }
    }

    public MBR(byte[] aMBR) {
      ParsePartition(aMBR, 446);
      ParsePartition(aMBR, 462);
      ParsePartition(aMBR, 478);
      ParsePartition(aMBR, 494);
    }

    protected void ParsePartition(byte[] aMBR, UInt32 aLoc) {
      byte xSystemID = aMBR[aLoc + 4];
      // SystemID = 0 means no partition
      if (xSystemID != 0) {
        UInt32 xStartSector = aMBR.ToUInt32(aLoc + 8);
        UInt32 xSectorCount = aMBR.ToUInt32(aLoc + 12);

        var xPartInfo = new PartInfo(xSystemID, xStartSector, xSectorCount);
        Partitions.Add(xPartInfo);
      }
    }

  }
}
