package main

import(
        "database/sql"
        "fmt"
        _"github.com/mattn/go-sqlite3"
	"os"
	"os/user"
	"strings"
)

func main(){

        db, err := sql.Open("sqlite3", user.HomeDir + "/gonotes/notes.db")
        checkErr(err)

        count := len(os.Args)

        if count > 1{
        firstArg := os.Args[1]

        switch firstArg{
        case "-list":
                //fmt.Println("List all notes")
		if count == 2 {
                	rows, err := db.Query("SELECT *  FROM lists")
                	checkErr(err)
                        fmt.Println("\n Existing lists are: ")

                	for rows.Next(){
				var id int
				var listName string
                        	err := rows.Scan(&id, &listName)
                        	checkErr(err)
				fmt.Println("\n " + listName)

                	}
		fmt.Println("\n ``````````````````````````````")
		fmt.Println("\n For notes in the list, type: ")
		fmt.Println("gonotes -list <list name> \n")
		} else{
			list := os.Args[2]
			processList(list, db)
			}
        default:
                processCrap(os.Args[1:], db)
        }
        }else{
                helpText()
        }
	db.Close()
}
func processCrap(args []string, db *sql.DB){
        c := len(args)
        
	firstId := 0
	arg := args[firstId]	
	
	var name string
	var Lid int
	if string(arg[0]) == "@"{
 		
		if c > 2 {
			listTag := arg
			fmt.Println("\n Added to list " + listTag)
		
         	       rows, err := db.Query("SELECT uid  FROM lists where name =?", string(listTag))
               	       checkErr(err)
		
		        for rows.Next(){
				err := rows.Scan(&Lid)
				//fmt.Println(Lid)
				checkErr(err)
			} 
			if Lid == 0{
				//fmt.Println("not found...creating")
				stmt, err := db.Prepare("INSERT INTO lists('name') values (?)")
				checkErr(err)
			
				_, err = stmt.Exec(string(listTag))
				checkErr(err)
			}else{
				//fmt.Println("List found.. ID: " + string(Lid))
			}
			firstId += 1
			name = args[firstId]
		
		} else {
			helpText()
		}
		}else{
		name = args[firstId]
		}

        if c>1{
        msg := args[firstId +1 :]
	messagewa := strings.Join(msg," ")
        ps := name + ": " + messagewa
        
	fmt.Println("\n Added: \n " + ps)

	//check if exists, if yes, update
        stmt, err := db.Prepare("update notes set message=?,created=CURRENT_TIMESTAMP,listid=? where name=?")
        checkErr(err)

        res,err := stmt.Exec(messagewa, Lid, name)
        checkErr(err)

        affect, err := res.RowsAffected()
        checkErr(err)

	if affect == 0{
		stmt, err := db.Prepare("INSERT INTO notes(name, message, created, listid) values(?,?,CURRENT_TIMESTAMP, ?)")
        	checkErr(err)

        	_, err = stmt.Exec(name, messagewa, Lid)
        	checkErr(err)

	        //id, err := res.LastInsertId()
        	//checkErr(err)

	        //fmt.Println(id)
	}
        }else{
                //fmt.Println("Check db for msg.. if not found open new multiline")
		rows, err := db.Query("SELECT * FROM notes where name =?", name)
        	checkErr(err)

        for rows.Next(){
                var uid int
                var name string
                var message string
                var created string
		var listid int
                err = rows.Scan(&uid, &name, &message, &created, &listid)
                checkErr(err)
                fmt.Println("\n " + name + " , " + created)
		fmt.Println("\n `````````````````````````````````")
		fmt.Println("\n " + message + "\n ")
        }

        }
}

func processList(list string, db *sql.DB){
		listTag:= list
		fmt.Println("\n " + listTag)
		fmt.Println("\n `````````````````````````\n")
		
                var Lid int
		rows, err := db.Query("SELECT uid  FROM lists where name =?", listTag)
                checkErr(err)

                for rows.Next(){
                        err = rows.Scan(&Lid)
                        //fmt.Println(Lid)
                        checkErr(err)
                }
		
		notesRows, err:= db.Query("SELECT * FROM notes where listid =?", Lid)
		checkErr(err)

        	for notesRows.Next(){
                	var uid int
                	var name string
                	var message string
                	var created string
			var listid int
                	err = notesRows.Scan(&uid, &name, &message, &created, &listid)
                	checkErr(err)
			var messagePrompt string
			if len(message) < 10 {
				messagePrompt = message
			}else{
				messagePrompt = message[:10]
			}
                	fmt.Println("\n " + name + ": " + messagePrompt + "... ")
        	}
		fmt.Println("\n")
}

func checkErr(err error){
        if err!= nil{
                panic(err)
        }
}

func helpText(){
                fmt.Println("\n GoNotes - Random notes and stuff \n")
                fmt.Println("``````````````````````````````````` \n")
                fmt.Println(" Usage: \n")
                fmt.Println(" gonotes <list tag> (optional) <name of the note> <note/message> \n")
                fmt.Println(" gonotes <name of the note> to display the note \n")
                fmt.Println(" gonotes -list <tag> to list all notes under tag \n")
                fmt.Println(" ```````````````````````````````````````````````` \n")



}