package domain

import (
	"fmt"
	"time"
)

type Company struct {
	Name         string `json:"name"`
	City         string `json:"city"`
	Link         string `json:"link"`
	Logo         string `json:"logo"`
	Description  string `json:"description"`
	LocationLink string `json:"location_link"`
}

type Stack struct {
	Name string `json:"name"`
	Logo string `json:"logo"`
	Link string `json:"link"`
}

type Job struct {
	Title               string   `json:"title"`
	Description         string   `json:"description"`
	Objectives          []string `json:"objectives"`
	FrontendStack       []Stack  `json:"frontend_stack"`
	BackendStack        []Stack  `json:"backend_stack"`
	InfrastructureStack []Stack  `json:"infrastructure_stack"`
}

type Experience struct {
	Company   Company   `json:"company"`
	Job       Job       `json:"job"`
	StartDate time.Time `json:"start_date"`
	EndDate   time.Time `json:"end_date"`
}

func (e Experience) Duration() string {
	end := e.EndDate
	if e.EndDate.IsZero() {
		end = time.Now()
	}

	duration := end.Sub(e.StartDate)
	years := int(duration.Hours() / (24 * 365))
	months := int(duration.Hours()/(24*30)) - years*12

	label := ""
	if years == 1 {
		label += "1 year"
	}

	if years > 1 {
		label += fmt.Sprintf("%d years", years)
	}

	if label != "" {
		label += ", "
	}

	if months == 1 {
		label += "1 month"
	}

	if months > 1 {
		label += fmt.Sprintf("%d months", months)
	}

	return label
}

func (e Experience) GetStartDate() string {
	return e.StartDate.Format("Jan 2006")
}

func (e Experience) GetEndDate() string {
	if e.EndDate.IsZero() {
		return "Present"
	}

	return e.EndDate.Format("Jan 2006")
}
