package ofile

import (
	"bufio"
	"bytes"
	"encoding/binary"
	"os"

	log "github.com/sirupsen/logrus"

	. "ios-wrapper/pkg/ios"
)

type OFile interface {
	Cleanup()
}

func NewOFile(f string) OFile {
	file, err := os.Open(f)
	if err != nil {
		return nil
	}
	r := bufio.NewReader(file)

	var magic uint32
	magic_buf, _ := r.Peek(4)
	magic_r := bytes.NewReader(magic_buf)
	binary.Read(magic_r, binary.LittleEndian, &magic)

	if magic != Magic32 && magic != Magic64 && magic != Cigam32 && magic != Cigam64 && magic != MagicFat &&
		magic != CigamFat {
		log.Panic("Magic does not match %x", magic)
		return nil
	}

	if magic == Magic32 || magic == Magic64 || magic == Cigam32 ||
		magic == Cigam64 {
		return NewMachoFile(f)
	}

	if magic == MagicFat || magic == CigamFat {
		return NewFatFile(f)
	}

	// not likely
	return nil
}