package parsing

type Gender rune

const (
	Male   Gender = 'M'
	Female Gender = 'F'
)

type Quarter string

const (
	QuarterOne   Quarter = "Q1"
	QuarterTwo   Quarter = "Q2"
	QuarterThree Quarter = "Q3"
	QuarterFour  Quarter = "Q4"
)

func (x Quarter) Uint8() uint8 {
  switch x {
  case QuarterOne:
    return 1
  case QuarterTwo:
    return 2
  case QuarterThree:
    return 3
  case QuarterFour:
    return 4
  }
  return 0
}

type Half string

const (
	HalfOne Half = "H1"
	HalfTwo Half = "H2"
)

func (x Half) Uint8() uint8 {
  switch x {
  case HalfOne:
    return 1
  case HalfTwo:
    return 2
  }
  return 0
}

type Month string

const (
	January   Month = "January"
	February  Month = "February"
	March     Month = "March"
	April     Month = "April"
	May       Month = "May"
	June      Month = "June"
	July      Month = "July"
	August    Month = "August"
	September Month = "September"
	October   Month = "October"
	November  Month = "November"
	December  Month = "December"
)

func (x Month) Uint8() uint8 {
	switch x {
	case January:
		return 1
	case February:
		return 2
	case March:
		return 3
	case April:
		return 4
	case May:
		return 5
	case June:
		return 6
	case July:
		return 7
	case August:
		return 8
	case September:
		return 9
	case October:
		return 10
	case November:
		return 11
	case December:
		return 12
	default:
		return 0
	}
}

type MonthShort string

const (
	Jan      MonthShort = "Jan"
	Feb      MonthShort = "Feb"
	Mar      MonthShort = "Mar"
	Apr      MonthShort = "Apr"
	MayShort MonthShort = "May"
	Jun      MonthShort = "Jun"
	Jul      MonthShort = "Jul"
	Aug      MonthShort = "Aug"
	Sep      MonthShort = "Sep"
	Oct      MonthShort = "Oct"
	Nov      MonthShort = "Nov"
	Dec      MonthShort = "Dec"
)

func (x MonthShort) Uint8() uint8 {
  switch x {
  case Jan:
    return 1
  case Feb:
    return 2
  case Mar:
    return 3
  case Apr:
    return 4
  case MayShort:
    return 5
  case Jun:
    return 6
  case Jul:
    return 7
  case Aug:
    return 8
  case Sep:
    return 9
  case Oct:
    return 10
  case Nov:
    return 11
  case Dec:
    return 12
  }
  return 0
}

type WeekDay string

const (
	Monday    WeekDay = "Monday"
	Tuesday   WeekDay = "Tuesday"
	Wednesday WeekDay = "Wednesday"
	Thursday  WeekDay = "Thursday"
	Friday    WeekDay = "Friday"
	Saturday  WeekDay = "Saturday"
	Sunday    WeekDay = "Sunday"
)

func (x WeekDay) Uint8() uint8 {
  switch x {
  case Monday:
    return 1
  case Tuesday:
    return 2
  case Wednesday:
    return 3
  case Thursday:
    return 4
  case Friday:
    return 5
  case Saturday:
    return 6
  case Sunday:
    return 7
  }
  return 0
}

type WeekDayShort string

const (
	Mon WeekDayShort = "Mon"
	Tue WeekDayShort = "Tue"
	Wed WeekDayShort = "Wed"
	Thu WeekDayShort = "Thu"
	Fri WeekDayShort = "Fri"
	Sat WeekDayShort = "Sat"
	Sun WeekDayShort = "Sun"
)

func (x WeekDayShort) Uint8() uint8 {
  switch x {
  case Mon:
    return 1
  case Tue:
    return 2
  case Wed:
    return 3
  case Thu:
    return 4
  case Fri:
    return 5
  case Sat:
    return 6
  case Sun:
    return 7
  }
  return 0
}


type Employee struct {
	EmpID                 uint32       `csv:"Emp ID"`
	NamePrefix            string       `csv:"Name Prefix"`
	FirstName             string       `csv:"First Name"`
	MiddleInitial         string       `csv:"Middle Initial"`
	LastName              string       `csv:"Last Name"`
	Gender                Gender       `csv:"Gender"`
	Email                 string       `csv:"E Mail"`
	FathersName           string       `csv:"Father's Name"`
	MothersName           string       `csv:"Mothers's Name"`
	MothersMaidenName     string       `csv:"Mother's Maiden Name"`
	Birthdate             string       `csv:"Date of Birth"`
	BirthTime             string       `csv:"Time of Birth"`
	WeightKg              uint16       `csv:"Weight in Kgs."`
	JoiningDate           string       `csv:"Date of Joining"`
	JoiningQuarter        Quarter      `csv:"Quarter of Joining"`
	JoiningHalf           Half         `csv:"Half of Joining"`
	JoiningYear           uint16       `csv:"Year of Joining"`
	JoiningMonth          uint8        `csv:"Month of Joining"`
	JoiningMonthName      Month        `csv:"Month Name of Joining"`
	JoiningMonthNameShort MonthShort   `csv:"Short Month"`
	JoiningMonthDay       uint8        `csv:"Day of Joining"`
	JoiningWeekDay        WeekDay      `csv:"DOW of Joining"`
	JoiningWeekDayShort   WeekDayShort `csv:"Short DOW"`
	YearsOfService        float32      `csv:"Age in Company (Years)"`
	Salary                uint32       `csv:"Salary"`
	LatestHikePercentage  string       `csv:"Last % Hike"`
	SSN                   string       `csv:"SSN"`
	PhoneNumber           string       `csv:"Phone No."`
	PlaceName             string       `csv:"Place Name"`
	County                string       `csv:"County"`
	City                  string       `csv:"City"`
	State                 string       `csv:"State"`
	Zip                   uint32       `csv:"Zip"`
	Region                string       `csv:"Region"`
	Username              string       `csv:"User Name"`
	Password              string       `csv:"Password"`
	// Empty slot
	// Empty slot
	// Empty slot
}
