package escalas

import (
	"context"

	"photum-backend/internal/db/generated"

	"github.com/google/uuid"
	"github.com/jackc/pgx/v5/pgtype"
)

type Service struct {
	queries *generated.Queries
}

func NewService(queries *generated.Queries) *Service {
	return &Service{queries: queries}
}

type CreateEscalaInput struct {
	AgendaID         string `json:"agenda_id"`
	ProfissionalID   string `json:"profissional_id"`
	DataHoraInicio   string `json:"data_hora_inicio"` // RFC3339
	DataHoraFim      string `json:"data_hora_fim"`    // RFC3339
	FuncaoEspecifica string `json:"funcao_especifica"`
}

func (s *Service) Create(ctx context.Context, input CreateEscalaInput) (*generated.AgendaEscala, error) {
	agendaID, err := uuid.Parse(input.AgendaID)
	if err != nil {
		return nil, err
	}
	profID, err := uuid.Parse(input.ProfissionalID)
	if err != nil {
		return nil, err
	}

	var start, end pgtype.Timestamptz
	err = start.Scan(input.DataHoraInicio)
	if err != nil {
		return nil, err
	}
	err = end.Scan(input.DataHoraFim)
	if err != nil {
		return nil, err
	}

	var funcao pgtype.Text
	if input.FuncaoEspecifica != "" {
		funcao = pgtype.Text{String: input.FuncaoEspecifica, Valid: true}
	}

	escala, err := s.queries.CreateEscala(ctx, generated.CreateEscalaParams{
		AgendaID:         pgtype.UUID{Bytes: agendaID, Valid: true},
		ProfissionalID:   pgtype.UUID{Bytes: profID, Valid: true},
		DataHoraInicio:   start,
		DataHoraFim:      end,
		FuncaoEspecifica: funcao,
	})
	if err != nil {
		return nil, err
	}
	return &escala, nil
}

func (s *Service) ListByAgenda(ctx context.Context, agendaID string) ([]generated.ListEscalasByAgendaIDRow, error) {
	parsedUUID, err := uuid.Parse(agendaID)
	if err != nil {
		return nil, err
	}
	return s.queries.ListEscalasByAgendaID(ctx, pgtype.UUID{Bytes: parsedUUID, Valid: true})
}

func (s *Service) Delete(ctx context.Context, id string) error {
	parsedUUID, err := uuid.Parse(id)
	if err != nil {
		return err
	}
	return s.queries.DeleteEscala(ctx, pgtype.UUID{Bytes: parsedUUID, Valid: true})
}

type UpdateEscalaInput struct {
	ProfissionalID   *string `json:"profissional_id"`
	DataHoraInicio   *string `json:"data_hora_inicio"`
	DataHoraFim      *string `json:"data_hora_fim"`
	FuncaoEspecifica *string `json:"funcao_especifica"`
}

func (s *Service) Update(ctx context.Context, id string, input UpdateEscalaInput) (*generated.AgendaEscala, error) {
	parsedUUID, err := uuid.Parse(id)
	if err != nil {
		return nil, err
	}

	params := generated.UpdateEscalaParams{
		ID: pgtype.UUID{Bytes: parsedUUID, Valid: true},
	}

	if input.ProfissionalID != nil {
		parsedProfID, err := uuid.Parse(*input.ProfissionalID)
		if err == nil {
			params.ProfissionalID = pgtype.UUID{Bytes: parsedProfID, Valid: true}
		}
	}
	if input.DataHoraInicio != nil {
		var t pgtype.Timestamptz
		if err := t.Scan(*input.DataHoraInicio); err == nil {
			params.DataHoraInicio = t
		}
	}
	if input.DataHoraFim != nil {
		var t pgtype.Timestamptz
		if err := t.Scan(*input.DataHoraFim); err == nil {
			params.DataHoraFim = t
		}
	}
	if input.FuncaoEspecifica != nil {
		params.FuncaoEspecifica = pgtype.Text{String: *input.FuncaoEspecifica, Valid: true}
	}

	escala, err := s.queries.UpdateEscala(ctx, params)
	if err != nil {
		return nil, err
	}
	return &escala, nil
}
