package tpdb

import (
	"fmt"
	"strconv"
	"strings"

	"git.leaktechnologies.dev/stu/Goondex/internal/model"
)

// mapPerformer converts a TPDB performer to our internal model
func mapPerformer(p PerformerResponse) model.Performer {
	performer := model.Performer{
		Name:            p.Name,
		Source:          "tpdb",
		SourceID:        p.ID,
		SourceNumericID: p.NumericID,
	}

	// Aliases
	if len(p.Aliases) > 0 {
		performer.Aliases = strings.Join(p.Aliases, ", ")
	}

	// Bio
	if p.Bio != nil {
		performer.Bio = *p.Bio
	}

	// Media
	if p.Image != nil {
		performer.ImageURL = *p.Image
	}
	if p.Poster != nil {
		performer.PosterURL = *p.Poster
	}

	// Extract from extras if available
	if p.Extras != nil {
		ex := p.Extras

		performer.Gender = ex.Gender

		// Personal information
		if ex.Birthday != nil {
			performer.Birthday = *ex.Birthday
		}
		if ex.Astrology != nil {
			performer.Astrology = *ex.Astrology
		}
		if ex.Birthplace != nil {
			performer.Birthplace = *ex.Birthplace
		}
		if ex.Ethnicity != nil {
			performer.Ethnicity = *ex.Ethnicity
		}
		if ex.Nationality != nil {
			performer.Nationality = *ex.Nationality
			performer.Country = *ex.Nationality
		}
		if ex.Deathday != nil {
			performer.DateOfDeath = *ex.Deathday
		}

		// Physical attributes
		if ex.EyeColour != nil {
			performer.EyeColor = *ex.EyeColour
		}
		if ex.HairColour != nil {
			performer.HairColor = *ex.HairColour
		}
		if ex.Height != nil {
			// Parse "160cm" -> 160
			heightStr := strings.TrimSuffix(*ex.Height, "cm")
			if h, err := strconv.Atoi(heightStr); err == nil {
				performer.Height = h
			}
		}
		if ex.Weight != nil {
			// Parse "49kg" -> 49
			weightStr := strings.TrimSuffix(*ex.Weight, "kg")
			if w, err := strconv.Atoi(weightStr); err == nil {
				performer.Weight = w
			}
		}
		if ex.Measurements != nil {
			performer.Measurements = *ex.Measurements
		}
		if ex.Cupsize != nil {
			performer.CupSize = *ex.Cupsize
		}
		if ex.Tattoos != nil {
			performer.TattooDescription = *ex.Tattoos
		}
		if ex.Piercings != nil {
			performer.PiercingDescription = *ex.Piercings
		}
		if ex.FakeBoobs != nil {
			if *ex.FakeBoobs {
				performer.BoobJob = "True"
			} else {
				performer.BoobJob = "False"
			}
		}

		// Career
		if ex.CareerStartYear != nil {
			performer.CareerStartYear = *ex.CareerStartYear
		}
		if ex.CareerEndYear != nil {
			performer.CareerEndYear = *ex.CareerEndYear
		}
		// Build career string
		if ex.CareerStartYear != nil {
			if ex.CareerEndYear != nil && *ex.CareerEndYear > 0 {
				performer.Career = fmt.Sprintf("%d–%d", *ex.CareerStartYear, *ex.CareerEndYear)
			} else {
				performer.Career = fmt.Sprintf("%d–", *ex.CareerStartYear)
			}
		}
		performer.Active = true // Assume active if no end year
		if ex.CareerEndYear != nil && *ex.CareerEndYear > 0 {
			performer.Active = false
		}
	}

	return performer
}

// mapStudio converts a TPDB studio to our internal model
func mapStudio(s StudioResponse) model.Studio {
	studio := model.Studio{
		Name:     s.Name,
		Source:   "tpdb",
		SourceID: strconv.Itoa(s.ID),
	}

	if s.Description != nil {
		studio.Description = *s.Description
	}

	if s.Logo != nil {
		studio.ImageURL = *s.Logo
	}

	// Handle parent studio
	if s.Parent != nil {
		// We'll need to look up or create the parent studio separately
		// For now, we'll store the parent ID as a string that needs to be resolved
		// This is a limitation that should be handled by the import logic
	}

	return studio
}

// mapScene converts a TPDB scene to our internal model
func mapScene(s SceneResponse) model.Scene {
	scene := model.Scene{
		Title:    s.Title,
		Source:   "tpdb",
		SourceID: s.ID,
	}

	if s.Description != nil {
		scene.Description = *s.Description
	}

	if s.URL != nil {
		scene.URL = *s.URL
	}

	if s.Date != nil {
		scene.Date = *s.Date
	}

	if s.Image != nil {
		scene.ImageURL = *s.Image
	}

	if s.Director != nil {
		scene.Director = *s.Director
	}

	if s.Code != nil {
		scene.Code = *s.Code
	}

	// Map performers
	if len(s.Performers) > 0 {
		performers := make([]model.Performer, 0, len(s.Performers))
		for _, p := range s.Performers {
			performer := model.Performer{
				Name:     p.Name,
				Source:   "tpdb",
				SourceID: p.ID,
			}
			if p.Gender != nil {
				performer.Gender = *p.Gender
			}
			performers = append(performers, performer)
		}
		scene.Performers = performers
	}

	// Map tags
	if len(s.Tags) > 0 {
		tags := make([]model.Tag, 0, len(s.Tags))
		for _, t := range s.Tags {
			tag := model.Tag{
				Name:     t.Name,
				Source:   "tpdb",
				SourceID: t.ID,
			}
			tags = append(tags, tag)
		}
		scene.Tags = tags
	}

	// Map studio
	if s.Site != nil {
		studio := model.Studio{
			Name:     s.Site.Name,
			Source:   "tpdb",
			SourceID: strconv.Itoa(s.Site.ID),
		}
		if s.Site.URL != nil {
			studio.Description = fmt.Sprintf("URL: %s", *s.Site.URL)
		}
		scene.Studio = &studio
	}

	return scene
}

// stringToInt64 safely converts a string to int64
func stringToInt64(s string) (int64, error) {
	return strconv.ParseInt(s, 10, 64)
}
