package excelize

import (
	"fmt"
	"testing"

	"github.com/stretchr/testify/assert"
)

var _ = []SheetViewOption{
	DefaultGridColor(true),
	RightToLeft(false),
	ShowFormulas(false),
	ShowGridLines(true),
	ShowRowColHeaders(true),
	TopLeftCell("B2"),
	// SheetViewOptionPtr are also SheetViewOption
	new(DefaultGridColor),
	new(RightToLeft),
	new(ShowFormulas),
	new(ShowGridLines),
	new(ShowRowColHeaders),
	new(TopLeftCell),
}

var _ = []SheetViewOptionPtr{
	(*DefaultGridColor)(nil),
	(*RightToLeft)(nil),
	(*ShowFormulas)(nil),
	(*ShowGridLines)(nil),
	(*ShowRowColHeaders)(nil),
	(*TopLeftCell)(nil),
}

func ExampleFile_SetSheetViewOptions() {
	f := NewFile()
	const sheet = "Sheet1"

	if err := f.SetSheetViewOptions(sheet, 0,
		DefaultGridColor(false),
		RightToLeft(false),
		ShowFormulas(true),
		ShowGridLines(true),
		ShowRowColHeaders(true),
		ZoomScale(80),
		TopLeftCell("C3"),
	); err != nil {
		fmt.Println(err)
	}

	var zoomScale ZoomScale
	fmt.Println("Default:")
	fmt.Println("- zoomScale: 80")

	if err := f.SetSheetViewOptions(sheet, 0, ZoomScale(500)); err != nil {
		fmt.Println(err)
	}

	if err := f.GetSheetViewOptions(sheet, 0, &zoomScale); err != nil {
		fmt.Println(err)
	}

	fmt.Println("Used out of range value:")
	fmt.Println("- zoomScale:", zoomScale)

	if err := f.SetSheetViewOptions(sheet, 0, ZoomScale(123)); err != nil {
		fmt.Println(err)
	}

	if err := f.GetSheetViewOptions(sheet, 0, &zoomScale); err != nil {
		fmt.Println(err)
	}

	fmt.Println("Used correct value:")
	fmt.Println("- zoomScale:", zoomScale)

	// Output:
	// Default:
	// - zoomScale: 80
	// Used out of range value:
	// - zoomScale: 80
	// Used correct value:
	// - zoomScale: 123

}

func ExampleFile_GetSheetViewOptions() {
	f := NewFile()
	const sheet = "Sheet1"

	var (
		defaultGridColor  DefaultGridColor
		rightToLeft       RightToLeft
		showFormulas      ShowFormulas
		showGridLines     ShowGridLines
		showZeros         ShowZeros
		showRowColHeaders ShowRowColHeaders
		zoomScale         ZoomScale
		topLeftCell       TopLeftCell
	)

	if err := f.GetSheetViewOptions(sheet, 0,
		&defaultGridColor,
		&rightToLeft,
		&showFormulas,
		&showGridLines,
		&showZeros,
		&showRowColHeaders,
		&zoomScale,
		&topLeftCell,
	); err != nil {
		fmt.Println(err)
	}

	fmt.Println("Default:")
	fmt.Println("- defaultGridColor:", defaultGridColor)
	fmt.Println("- rightToLeft:", rightToLeft)
	fmt.Println("- showFormulas:", showFormulas)
	fmt.Println("- showGridLines:", showGridLines)
	fmt.Println("- showZeros:", showZeros)
	fmt.Println("- showRowColHeaders:", showRowColHeaders)
	fmt.Println("- zoomScale:", zoomScale)
	fmt.Println("- topLeftCell:", `"`+topLeftCell+`"`)

	if err := f.SetSheetViewOptions(sheet, 0, TopLeftCell("B2")); err != nil {
		fmt.Println(err)
	}

	if err := f.GetSheetViewOptions(sheet, 0, &topLeftCell); err != nil {
		fmt.Println(err)
	}

	if err := f.SetSheetViewOptions(sheet, 0, ShowGridLines(false)); err != nil {
		fmt.Println(err)
	}

	if err := f.GetSheetViewOptions(sheet, 0, &showGridLines); err != nil {
		fmt.Println(err)
	}

	if err := f.SetSheetViewOptions(sheet, 0, ShowZeros(false)); err != nil {
		fmt.Println(err)
	}

	if err := f.GetSheetViewOptions(sheet, 0, &showZeros); err != nil {
		fmt.Println(err)
	}

	fmt.Println("After change:")
	fmt.Println("- showGridLines:", showGridLines)
	fmt.Println("- showZeros:", showZeros)
	fmt.Println("- topLeftCell:", topLeftCell)

	// Output:
	// Default:
	// - defaultGridColor: true
	// - rightToLeft: false
	// - showFormulas: false
	// - showGridLines: true
	// - showZeros: true
	// - showRowColHeaders: true
	// - zoomScale: 0
	// - topLeftCell: ""
	// After change:
	// - showGridLines: false
	// - showZeros: false
	// - topLeftCell: B2
}

func TestSheetViewOptionsErrors(t *testing.T) {
	f := NewFile()
	const sheet = "Sheet1"

	assert.NoError(t, f.GetSheetViewOptions(sheet, 0))
	assert.NoError(t, f.GetSheetViewOptions(sheet, -1))
	assert.Error(t, f.GetSheetViewOptions(sheet, 1))
	assert.Error(t, f.GetSheetViewOptions(sheet, -2))
	assert.NoError(t, f.SetSheetViewOptions(sheet, 0))
	assert.NoError(t, f.SetSheetViewOptions(sheet, -1))
	assert.Error(t, f.SetSheetViewOptions(sheet, 1))
	assert.Error(t, f.SetSheetViewOptions(sheet, -2))
}