package bimg

/*
#cgo pkg-config: vips
#include "vips/vips.h"
*/
import "C"

const (
	QUALITY  = 80
	MAX_SIZE = 16383
)

type Gravity int

const (
	CENTRE Gravity = iota
	NORTH
	EAST
	SOUTH
	WEST
)

type Interpolator int

const (
	BICUBIC Interpolator = iota
	BILINEAR
	NOHALO
)

var interpolations = map[Interpolator]string{
	BICUBIC:  "bicubic",
	BILINEAR: "bilinear",
	NOHALO:   "nohalo",
}

func (i Interpolator) String() string {
	return interpolations[i]
}

type Angle int

const (
	D0   Angle = 0
	D90  Angle = 90
	D180 Angle = 180
	D270 Angle = 270
)

type Direction int

const (
	HORIZONTAL Direction = C.VIPS_DIRECTION_HORIZONTAL
	VERTICAL   Direction = C.VIPS_DIRECTION_VERTICAL
)

// Image interpretation type
// See: http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/VipsImage.html#VipsInterpretation
type Interpretation int

const (
	INTERPRETATION_ERROR     Interpretation = C.VIPS_INTERPRETATION_ERROR
	INTERPRETATION_MULTIBAND Interpretation = C.VIPS_INTERPRETATION_MULTIBAND
	INTERPRETATION_B_W       Interpretation = C.VIPS_INTERPRETATION_B_W
	INTERPRETATION_CMYK      Interpretation = C.VIPS_INTERPRETATION_CMYK
	INTERPRETATION_RGB       Interpretation = C.VIPS_INTERPRETATION_RGB
	INTERPRETATION_sRGB      Interpretation = C.VIPS_INTERPRETATION_sRGB
	INTERPRETATION_RGB16     Interpretation = C.VIPS_INTERPRETATION_RGB16
	INTERPRETATION_GREY16    Interpretation = C.VIPS_INTERPRETATION_GREY16
	INTERPRETATION_scRGB     Interpretation = C.VIPS_INTERPRETATION_scRGB
	INTERPRETATION_LAB       Interpretation = C.VIPS_INTERPRETATION_LAB
	INTERPRETATION_XYZ       Interpretation = C.VIPS_INTERPRETATION_XYZ
)

const WATERMARK_FONT = "sans 10"

// Color represents a traditional RGB color scheme
type Color struct {
	R, G, B uint8
}

// Shortcut to black RGB color representation
var ColorBlack = Color{0, 0, 0}

// Text-based watermark configuration
type Watermark struct {
	Width       int
	DPI         int
	Margin      int
	Opacity     float32
	NoReplicate bool
	Text        string
	Font        string
	Background  Color
}

type GaussianBlur struct {
	Sigma   float64
	MinAmpl float64
}

type Sharpen struct {
	Radius int
	X1     float64
	Y2     float64
	Y3     float64
	M1     float64
	M2     float64
}

// Supported image transformation options
type Options struct {
	Height         int
	Width          int
	AreaHeight     int
	AreaWidth      int
	Top            int
	Left           int
	Extend         int
	Quality        int
	Compression    int
	Zoom           int
	Crop           bool
	Enlarge        bool
	Embed          bool
	Flip           bool
	Flop           bool
	Force          bool
	NoAutoRotate   bool
	NoProfile      bool
	Interlace      bool
	Rotate         Angle
	Background     Color
	Gravity        Gravity
	Watermark      Watermark
	Type           ImageType
	Interpolator   Interpolator
	Interpretation Interpretation
	GaussianBlur   GaussianBlur
	Sharpen        Sharpen
}
