/*
Convert CBZ/CBR/Dir into EPUB for e-reader devices (Kindle Devices, ...)

My goal is to make a simple, crossplatform, and fast tool to convert comics into EPUB.

EPUB is now support by Amazon through [SendToKindle](https://www.amazon.com/gp/sendtokindle/), by Email or by using the App. So I've made it simple to support the size limit constraint of those services.
*/
package main

import (
	"encoding/json"
	"fmt"
	"os"
	"runtime/debug"

	"github.com/celogeek/go-comic-converter/v2/internal/converter"
	"github.com/celogeek/go-comic-converter/v2/internal/epub"
	epuboptions "github.com/celogeek/go-comic-converter/v2/internal/epub/options"
	"github.com/tcnksm/go-latest"
)

func main() {
	cmd := converter.New()
	if err := cmd.LoadConfig(); err != nil {
		cmd.Fatal(err)
	}
	cmd.InitParse()
	cmd.Parse()

	if cmd.Options.Version {
		bi, ok := debug.ReadBuildInfo()
		if !ok {
			fmt.Fprintln(os.Stderr, "failed to fetch current version")
			os.Exit(1)
		}

		githubTag := &latest.GithubTag{
			Owner:      "celogeek",
			Repository: "go-comic-converter",
		}
		v, err := githubTag.Fetch()
		if err != nil || len(v.Versions) < 1 {
			fmt.Fprintln(os.Stderr, "failed to fetch the latest version")
			os.Exit(1)
		}
		latest_version := v.Versions[0]

		fmt.Fprintf(os.Stderr, `go-comic-converter
  Path             : %s
  Sum              : %s
  Version          : %s
  Available Version: %s

To install the latest version:
$ go install github.com/celogeek/go-comic-converter/v%d@%s
`,
			bi.Main.Path,
			bi.Main.Sum,
			bi.Main.Version,
			latest_version.Original(),
			latest_version.Segments()[0],
			latest_version.Original(),
		)
		return
	}

	if cmd.Options.Save {
		cmd.Options.SaveConfig()
		fmt.Fprintf(
			os.Stderr,
			"%s%s\n\nSaving to %s\n",
			cmd.Options.Header(),
			cmd.Options.ShowConfig(),
			cmd.Options.FileName(),
		)
		return
	}

	if cmd.Options.Show {
		fmt.Fprintln(os.Stderr, cmd.Options.Header(), cmd.Options.ShowConfig())
		return
	}

	if cmd.Options.Reset {
		cmd.Options.ResetConfig()
		fmt.Fprintf(
			os.Stderr,
			"%s%s\n\nReset default to %s\n",
			cmd.Options.Header(),
			cmd.Options.ShowConfig(),
			cmd.Options.FileName(),
		)
		return
	}

	if err := cmd.Validate(); err != nil {
		cmd.Fatal(err)
	}

	if cmd.Options.Json {
		json.NewEncoder(os.Stdout).Encode(map[string]any{
			"type": "options", "data": cmd.Options,
		})
	} else {
		fmt.Fprintln(os.Stderr, cmd.Options)
	}

	profile := cmd.Options.GetProfile()

	if err := epub.New(&epuboptions.Options{
		Input:                      cmd.Options.Input,
		Output:                     cmd.Options.Output,
		LimitMb:                    cmd.Options.LimitMb,
		Title:                      cmd.Options.Title,
		TitlePage:                  cmd.Options.TitlePage,
		Author:                     cmd.Options.Author,
		StripFirstDirectoryFromToc: cmd.Options.StripFirstDirectoryFromToc,
		SortPathMode:               cmd.Options.SortPathMode,
		Workers:                    cmd.Options.Workers,
		Dry:                        cmd.Options.Dry,
		DryVerbose:                 cmd.Options.DryVerbose,
		Quiet:                      cmd.Options.Quiet,
		Json:                       cmd.Options.Json,
		Image: &epuboptions.Image{
			Crop:                     &epuboptions.Crop{Enabled: cmd.Options.Crop, Left: cmd.Options.CropRatioLeft, Up: cmd.Options.CropRatioUp, Right: cmd.Options.CropRatioRight, Bottom: cmd.Options.CropRatioBottom},
			Quality:                  cmd.Options.Quality,
			Brightness:               cmd.Options.Brightness,
			Contrast:                 cmd.Options.Contrast,
			AutoContrast:             cmd.Options.AutoContrast,
			AutoRotate:               cmd.Options.AutoRotate,
			AutoSplitDoublePage:      cmd.Options.AutoSplitDoublePage,
			KeepDoublePageIfSplitted: cmd.Options.KeepDoublePageIfSplitted,
			NoBlankImage:             cmd.Options.NoBlankImage,
			Manga:                    cmd.Options.Manga,
			HasCover:                 cmd.Options.HasCover,
			View:                     &epuboptions.View{Width: profile.Width, Height: profile.Height, AspectRatio: cmd.Options.AspectRatio, PortraitOnly: cmd.Options.PortraitOnly, Color: epuboptions.Color{Foreground: cmd.Options.ForegroundColor, Background: cmd.Options.BackgroundColor}},
			GrayScale:                cmd.Options.Grayscale,
			GrayScaleMode:            cmd.Options.GrayscaleMode,
			Resize:                   !cmd.Options.NoResize,
			Format:                   cmd.Options.Format,
			AppleBookCompatibility:   cmd.Options.AppleBookCompatibility,
		},
	}).Write(); err != nil {
		fmt.Fprintf(os.Stderr, "Error: %v\n", err)
		os.Exit(1)
	}
	if !cmd.Options.Dry {
		cmd.Stats()
	}
}