//
//  tank
//
//  Import and Playlist Daemon for autoradio project
//
//
//  Copyright (C) 2017-2018 Christian Pointner <equinox@helsinki.at>
//
//  This file is part of tank.
//
//  tank is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  any later version.
//
//  tank is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with tank. If not, see <http://www.gnu.org/licenses/>.
//

package store

import (
	"errors"
	"strings"
)

type AudioFormat int

const (
	FormatWAV AudioFormat = iota
	FormatFlac
)

func (f AudioFormat) String() string {
	switch f {
	case FormatWAV:
		return "wav"
	case FormatFlac:
		return "flac"
	}
	return "unknown"
}

func (f *AudioFormat) fromString(str string) error {
	switch strings.ToLower(str) {
	case "wav":
		*f = FormatWAV
	case "flac":
		*f = FormatFlac
	default:
		return errors.New("invalid audio format: '" + str + "'")
	}
	return nil
}

func (f AudioFormat) MarshalText() (data []byte, err error) {
	data = []byte(f.String())
	return
}

func (f *AudioFormat) UnmarshalText(data []byte) (err error) {
	return f.fromString(string(data))
}

func (f AudioFormat) Extension() string {
	switch f {
	case FormatWAV:
		return ".wav"
	case FormatFlac:
		return ".flac"
	}
	return ""
}

type AudioConfig struct {
	Format     AudioFormat `json:"format" yaml:"format" toml:"format"`
	SampleRate uint        `json:"sample-rate" yaml:"sample-rate" toml:"sample-rate"`
}

type DBConfig struct {
	Type       string `json:"type" yaml:"type" toml:"type"`
	Connection string `json:"connection" yaml:"connection" toml:"connection"`
}

type Config struct {
	BasePath string      `json:"path" yaml:"path" toml:"path"`
	Audio    AudioConfig `json:"audio" yaml:"audio" toml:"audio"`
	DB       DBConfig    `json:"db" yaml:"db" toml:"db"`
}