package main

import (
	"fmt"
	"strconv"
	"time"
	"tyieih/models"

	"github.com/gin-gonic/gin"
)

var Db = models.Gdo{}

func init() {
	Db = *models.NewGdo()
}

type VehicleSql struct {
	id      int
	name    string
	indate  string
	outdate string
	day     int
	monthly string
}

/*
车牌号     ->ocr 自动拍照识别 并存到数据库   	string
进场时间   ->记录时间 并存到数据库 		date
出场时间    ->

	10分钟内免费   ->出场时对比时间戳 少于600秒免费
	3小时内 5元     ->  大于600秒 小于10800秒
	3-10小时 10元   -> 大于10800秒 小于 36000秒
	10-23小时15元  -> 大于36000秒 小于82800秒
	0-7点过夜5元   ->如果0点前进场并且小于3小时 5元 +5元 =10元
	月票400月          直接记录充值时间 +30天的到期时间date    -> 字段 monthly  string
	包月到期时 如果车子还在停车场则按非包月进行计费

白天和夜晚累计计费以电脑计时为准，24小时全天封顶收费20元

CREATE TABLE `vehicle` (

	`id` int(11) NOT NULL AUTO_INCREMENT,
	`name` varchar(30) NOT NULL DEFAULT '',
	`indate` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
	`outdate` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
	 `monthly` datetime DEFAULT '1000-01-01 00:00:00',
	PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
*/
func main() {
	r := gin.Default()
	//车辆进场
	r.POST("in", func(ctx *gin.Context) {
		//1.ocr提取车辆车牌号
		numberStr := ""
		//进场 记录车牌号 进场时间
		inDate := time.Now().Format("2006-01-02 15:04-05")
		i64 := Db.Sql("INSERT INTO vehicle (name,indate) VALUES (?,?)", numberStr, inDate).Insert()
		if i64 > 0 {
			ctx.String(200, "true")
		} else {
			ctx.String(200, "false")
		}

	})
	//车辆出场
	r.POST("out", func(ctx *gin.Context) {
		//1.ocr提取车辆车牌号
		u := VehicleSql{}
		bl := Db.Sql("SELECT * FROM vehicle WHERE name=?").Row(&u.id, &u.name, &u.indate, &u.outdate, &u.day, &u.monthly)
		if !bl {
			ctx.String(200, "车辆查询失败,请重新识别")
			return
		}
		loc, _ := time.LoadLocation("Asia/Shanghai")
		tt, _ := time.ParseInLocation("2006-01-02 15:04:05", u.indate, loc) //2006-01-02 15:04:05是转换的格式如php的"Y-m-d H:i:s"
		inTime := tt.Unix()
		tt1, _ := time.ParseInLocation("2006-01-02 15:04:05", u.outdate, loc) //2006-01-02 15:04:05是转换的格式如php的"Y-m-d H:i:s"
		outTime := tt1.Unix()
		//停车秒数
		result := outTime - inTime
		if result < 600 {
			ctx.String(200, "车辆10分钟内免费")
			return
		}
		//包月用户
		if u.monthly > time.Now().Format("2006-01-02 15:04:05") {
			ctx.String(200, "车辆为包月客户,免费")
			return
		}
		h := int64(360)
		reH := result / h
		//夜里0-7点进场,出场 ,并且停车时间不大于7个小时,否则以白天和夜晚累计计费以电脑计时为准
		dateH, _ := strconv.Atoi(u.outdate[5:7])
		if dateH < 8 && reH <= 7 {
			ctx.String(200, "夜里0-7点停车,收费5元")
			return
		}

		day, h, f := Calculate(result)
		//停车一天内
		if day == 0 {
			//3-10小时 10元
			if h < 3 {
				ctx.String(200, "停车"+fmt.Sprintf("%d", reH)+"小时"+fmt.Sprintf("%d", f)+"分,收费5元")
				return
			}
			//3-10小时 10元
			if h < 10 {
				ctx.String(200, "停车"+fmt.Sprintf("%d", reH)+"小时"+fmt.Sprintf("%d", f)+"分,收费10元")
				return
			}
			//10-23小时15元
			if h < 24 {
				ctx.String(200, "停车"+fmt.Sprintf("%d", reH)+"小时"+fmt.Sprintf("%d", f)+"分,收费15元")
				return
			}
			return
		}
		dayMoney := day * 10
		hMoney := int64(0)
		showStr := ""
		//3-10小时 10元
		if h < 3 {
			hMoney = 5
			showStr = fmt.Sprintf("%d", h) + "小时" + fmt.Sprintf("%d", f) + "分,收费"
		}
		//3-10小时 10元
		if h < 10 {
			hMoney = 10
			showStr = fmt.Sprintf("%d", h) + "小时" + fmt.Sprintf("%d", f) + "分,收费"
		}
		//10-23小时15元
		if h < 24 {
			hMoney = 15
			showStr = fmt.Sprintf("%d", h) + "小时" + fmt.Sprintf("%d", f) + "分,收费"
		}
		Money := dayMoney + hMoney
		showStr = "停车 " + fmt.Sprintf("%d", day) + " 天" + showStr + " " + fmt.Sprintf("%d", Money) + " 元"
		ctx.String(200, showStr)
	})
	//管理员登录 管理车辆
	r.GET("vehicle", func(ctx *gin.Context) {

	})
	r.Run(":80")
}

// 返回 天数 小时 分钟
func Calculate(result int64) (int64, int64, int64) {
	resulD := int64(0)
	resulH := int64(0)
	resulF := int64(0)
	//一小时3600秒
	h := int64(3600)
	//停车总小时数
	countH := result / h
	//停车一天内
	if countH < 24 {
		miao := result - (countH * h)
		if miao > 60 {
			resulF = miao / 60
			return 0, resulH, resulF
		}
		return 0, resulH, resulF
	}
	//停车天数
	resulD = resulH / 24
	//得到小时数
	resulH = resulH - (resulD * 24)
	//得到剩余秒数
	mm := result - (countH * h)
	if mm > 60 {
		//得到剩余分钟
		resulF = mm / 60
		return resulD, resulH, resulF
	} else {
		//小于1分的剩余秒数 忽略
		return resulD, resulH, resulF
	}

}
