package common

import (
	"dbweb/core"
	"dbweb/modules/common/recordview"
	"net/url"
	"strconv"

	"fmt"

	"dbweb/lib/safe"
	"dbweb/lib/strfun"

)

//sequenceDataRow is one row of data
type sequenceDataRow struct {
	RowNum     int64
	Key        string //该行关联的主键值，多字段用csv格式组合
	CanDisplay bool
	URL        string

	Data map[string]interface{}
}

type sequenceProcess struct {
	Name   string
	URL    string
	Active bool
}

//SequenceOperate 定义连续操作业务类
type SequenceOperate struct{}

//SequenceOperateData 用于传递连续操作的参数
type SequenceOperateData struct {
	RowCount    int64
	SQL         string
	PrimaryKeys []string
}

func init() {
	core.RegisterFun(  "SequenceOperate",new(SequenceOperate),  "_layout/blank")
}

//Get 操作的业务类
func (r *SequenceOperate) Get(p *core.ElementHandleArgs) {
	reqQuery := p.Req.URL.Query()
	callParam := recordview.GetCallParam(p)
	active := reqQuery.Get("active")
	var firstProcess, activeProcess *recordview.RecordViewProcess
	divide := strfun.DecodeCSV(reqQuery.Get("divide"))
	upDivide := reqQuery["updivide"]
	//增加一个当前行号的参数，用于下一页跳转到上页末尾
	mlast := reqQuery.Get("mlast")
	upRN := reqQuery["uprn"]
	if callParam == nil {
		p.RenderTimeout()
		return
	}
	divideRowNum, err := strconv.ParseInt(reqQuery.Get("rn"), 10, 64)
	if err != nil {
		divideRowNum = 0
	}
	rowCount, err := strconv.ParseInt(reqQuery.Get("rc"), 10, 64)
	if err != nil {
		rowCount = -1
	}

	fromRecordView := callParam.FromRecordView(p.DB)
	if rowCount == -1 {
		rowCount, err = callParam.Select.RowCount()
		if err != nil {
			core.LOG.Panic(err)
		}
	}
	p.More["RowCount"] = rowCount
	p.More["Label"] = fromRecordView.DisplayLabel()
	p.More["Processes"] = func() []sequenceProcess {
		rev := []sequenceProcess{}
		for _, one := range fromRecordView.Params.Processes {
			if one.BindRecord {
				if firstProcess == nil {
					firstProcess = one
				}
				seq := sequenceProcess{one.Name, "", false}
				if active == one.Name {
					seq.Active = true
					activeProcess = one
				} else {
					u, _ := url.Parse(p.Req.URL.String())
					nq := u.Query()
					nq.Del("divide")
					nq.Del("rn")
					nq.Del("updivide")
					nq.Del("uprn")
					nq.Del("mlast")
					nq.Set("active", one.Name)
					u.RawQuery = nq.Encode()

					seq.URL = u.String()
				}
				rev = append(rev, seq)
			}
		}
		if len(rev) > 0 && len(active) == 0 {
			rev[0].Active = true
			activeProcess = firstProcess
		}
		return rev
	}()
	callParam.Select.Divide = divide
	divideRowNum++
	render, err := fromRecordView.Params.QueryRender(callParam.Select, nil, divideRowNum)
	if err != nil {
		p.RenderError(err.Error())
		return
	}
	p.More["MoveLast"] = mlast
	p.More["ActiveProcess"] = activeProcess
	p.More["Rows"] = render.Rows
	p.More["Columns"] = render.Columns
	if !render.First() {
		prevPageURL, _ := url.Parse(p.Req.URL.String())
		//组合上一页的URL
		nq := prevPageURL.Query()
		nq.Set("divide", upDivide[len(upDivide)-1])
		nq.Set("rn", upRN[len(upRN)-1])
		nq["updivide"] = upDivide[:len(upDivide)-1]
		nq["uprn"] = upRN[:len(upRN)-1]
		nq.Del("mlast")
		nq.Set("rc", safe.String(rowCount))
		prevPageURL.RawQuery = nq.Encode()
		p.More["PrevPageURL"] = prevPageURL.String()
	}
	if !render.Last() {
		nextPageURL, _ := url.Parse(p.Req.URL.String())
		//组合下一页的URL
		nq := nextPageURL.Query()
		nq.Set("divide", render.DownDivide)
		nq.Set("rn", fmt.Sprintf("%d", render.DownRowNum))
		nq["updivide"] = append(upDivide, reqQuery.Get("divide"))
		nq["uprn"] = append(upRN, reqQuery.Get("rn"))
		nq.Del("mlast")
		nq.Set("rc", safe.String(rowCount))
		nextPageURL.RawQuery = nq.Encode()
		p.More["NextPageURL"] = nextPageURL.String()
	}
	p.HTML()
}
