package main

import (
	"fmt"
	"strconv"
)

type ProcessQueue struct {
	ProcessQueue []*Process
	typeOfAl     int
	time         int
}

func (s ProcessQueue) Len() int {
	return len(s.ProcessQueue)
}

func (s ProcessQueue) Swap(i, j int) {
	s.ProcessQueue[i], s.ProcessQueue[j] = s.ProcessQueue[j], s.ProcessQueue[i]
}

// Less 实现接口，用于sort排序
func (s ProcessQueue) Less(i, j int) bool {
	switch s.typeOfAl {
	case 1:
		return s.ProcessQueue[i].arriveTime < s.ProcessQueue[j].arriveTime
	case 2:
		return s.ProcessQueue[i].serveTime < s.ProcessQueue[j].serveTime
	case 3:
		return (s.time-s.ProcessQueue[i].arriveTime+s.ProcessQueue[i].serveTime)*s.ProcessQueue[j].serveTime > (s.time-s.ProcessQueue[j].arriveTime+s.ProcessQueue[j].serveTime)*s.ProcessQueue[i].serveTime
	case 4:
		return s.ProcessQueue[i].priority > s.ProcessQueue[j].priority
	case 5:
		return s.ProcessQueue[i].beginTime < s.ProcessQueue[j].beginTime
	}
	return s.ProcessQueue[i].arriveTime < s.ProcessQueue[j].arriveTime
}

func initProcessQueue() ProcessQueue {
	var processQueue ProcessQueue
	var numOfProcess int
	var name string
	var arriveTime int
	var serveTime int
	fmt.Print("[+]请输入进程数量:")
	fmt.Scan(&numOfProcess)
	for i := 0; i < numOfProcess; i++ {
		fmt.Print("[+]请输入第" + strconv.Itoa(i) + "个进程的信息(到达时间 服务时间 进程名称): ")
		fmt.Scan(&arriveTime, &serveTime, &name)
		processQueue.ProcessQueue = append(processQueue.ProcessQueue, newProcess(name, arriveTime, serveTime))
	}
	fmt.Println("[-]进程ID\t进程名称\t到达时间\t服务时间")
	for i := 0; i < numOfProcess; i++ {
		fmt.Println("[-]" + strconv.Itoa(i) + "\t\t" + processQueue.ProcessQueue[i].name + "\t\t" + strconv.Itoa(processQueue.ProcessQueue[i].arriveTime) + "\t\t" + strconv.Itoa(processQueue.ProcessQueue[i].serveTime))
	}
	return processQueue
}
