package main

import (
	"flag"
	"fmt"
	"os"
	"strconv"
)

type tugas struct {
	nama      string
	prioritas string
	selesai   bool
}

// daftar diisi contoh bawaan agar tiap perintah bisa diuji sendiri-sendiri.
var daftar = []tugas{
	{nama: "belajar Go", prioritas: "tinggi"},
	{nama: "merapikan kode", prioritas: "rendah"},
}

func main() {
	if len(os.Args) < 2 {
		fmt.Fprintln(os.Stderr, "pemakaian: todo <perintah> [argument]")
		fmt.Fprintln(os.Stderr, "perintah tersedia: add, list, done")
		os.Exit(2)
	}

	cmd, sisa := os.Args[1], os.Args[2:]
	switch cmd {
	case "add":
		addCmd(sisa)
	case "list":
		listCmd(sisa)
	case "done":
		doneCmd(sisa)
	default:
		fmt.Fprintf(os.Stderr, "perintah tidak dikenal: %q\n", cmd)
		fmt.Fprintln(os.Stderr, "perintah tersedia: add, list, done")
		os.Exit(2)
	}
}

func addCmd(args []string) {
	// Setiap subcommand memakai FlagSet sendiri.
	fs := flag.NewFlagSet("add", flag.ExitOnError)
	prioritas := fs.String("prioritas", "rendah", "tingkat prioritas tugas")
	fs.Parse(args)

	if fs.NArg() == 0 {
		fmt.Fprintln(os.Stderr, "pemakaian: todo add [flag] <nama tugas>")
		os.Exit(2)
	}
	daftar = append(daftar, tugas{nama: fs.Arg(0), prioritas: *prioritas})
	fmt.Printf("ditambahkan: %s (prioritas: %s)\n", fs.Arg(0), *prioritas)
	cetakDaftar(false)
}

func listCmd(args []string) {
	fs := flag.NewFlagSet("list", flag.ExitOnError)
	hanyaSelesai := fs.Bool("selesai", false, "hanya tampilkan tugas selesai")
	fs.Parse(args)

	cetakDaftar(*hanyaSelesai)
}

func doneCmd(args []string) {
	fs := flag.NewFlagSet("done", flag.ExitOnError)
	fs.Parse(args)

	if fs.NArg() != 1 {
		fmt.Fprintln(os.Stderr, "pemakaian: todo done <nomor tugas>")
		os.Exit(2)
	}
	nomor, err := strconv.Atoi(fs.Arg(0))
	if err != nil || nomor < 1 || nomor > len(daftar) {
		fmt.Fprintf(os.Stderr, "nomor tugas tidak valid: %q\n", fs.Arg(0))
		os.Exit(1)
	}
	daftar[nomor-1].selesai = true
	fmt.Printf("tugas #%d selesai: %s\n", nomor, daftar[nomor-1].nama)
	cetakDaftar(false)
}

func cetakDaftar(selesaiSaja bool) {
	for i, t := range daftar {
		// Lewati tugas yang belum selesai bila filter aktif.
		if selesaiSaja && !t.selesai {
			continue
		}
		status := "[ ]"
		if t.selesai {
			status = "[x]"
		}
		fmt.Printf("%d. %s %s (prioritas: %s)\n", i+1, status, t.nama, t.prioritas)
	}
}
