package sqlType

import (
	"database/sql/driver"
	"encoding/json"

	"github.com/jackc/pgtype"
)

type JSONB struct {
	Val   pgtype.JSONB
	Valid bool
}

func NewJSONB(v interface{}) JSONB {
	j := new(JSONB)
	j.Val = pgtype.JSONB{}
	if err := j.Val.Set(v); err == nil {
		j.Valid = true
		return *j
	}

	return *j
}

func (j *JSONB) Set(value interface{}) error {
	if err := j.Val.Set(value); err != nil {
		j.Valid = false
		return err
	}

	j.Valid = true

	return nil
}

func (j *JSONB) Bind(model interface{}) error {
	return j.Val.AssignTo(model)
}

func (j *JSONB) Scan(value interface{}) error {
	j.Val = pgtype.JSONB{}
	if value == nil {
		j.Valid = false
		return nil
	}

	j.Valid = true

	return j.Val.Scan(value)
}

func (j JSONB) Value() (driver.Value, error) {
	if j.Valid {
		return j.Val.Value()
	}

	return nil, nil
}

func (j JSONB) MarshalJSON() ([]byte, error) {
	if j.Valid {
		return j.Val.MarshalJSON()
	}

	return json.Marshal(nil)
}

func (j *JSONB) UnmarshalJSON(b []byte) error {
	if string(b) == "null" {
		j.Valid = false
		return j.Val.UnmarshalJSON(b)
	}

	return j.Val.UnmarshalJSON(b)
}