Index: backend/src/main/java/com/trekr/backend/controller/WeightController.java
===================================================================
--- backend/src/main/java/com/trekr/backend/controller/WeightController.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
+++ backend/src/main/java/com/trekr/backend/controller/WeightController.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
@@ -0,0 +1,97 @@
+package com.trekr.backend.controller;
+
+import com.trekr.backend.dto.weight.CreateDailyIntakeRequest;
+import com.trekr.backend.dto.weight.TrackingStatusResponse;
+import com.trekr.backend.dto.weight.WeightDailyIntakeDto;
+import com.trekr.backend.dto.weight.WeightDailyIntakesResponse;
+import com.trekr.backend.dto.weight.WeightProfileResponse;
+import com.trekr.backend.dto.weight.WeightStartRequest;
+import com.trekr.backend.dto.weight.TodayTrainingInfoDto;
+import com.trekr.backend.security.UserPrincipal;
+import com.trekr.backend.service.WeightService;
+import jakarta.validation.Valid;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.core.Authentication;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/weight")
+public class WeightController {
+
+    private final WeightService weightService;
+
+    public WeightController(WeightService weightService) {
+        this.weightService = weightService;
+    }
+
+    @GetMapping("/status")
+    public TrackingStatusResponse status(Authentication authentication) {
+        UserPrincipal principal = (UserPrincipal) authentication.getPrincipal();
+        return new TrackingStatusResponse(weightService.isTracking(principal.getUserId()));
+    }
+
+    @PostMapping("/start")
+    @ResponseStatus(HttpStatus.CREATED)
+    public TrackingStatusResponse start(
+            @Valid @RequestBody WeightStartRequest request,
+            Authentication authentication) {
+        UserPrincipal principal = (UserPrincipal) authentication.getPrincipal();
+        weightService.startTracking(principal.getUserId(), request);
+        return new TrackingStatusResponse(true);
+    }
+
+    @GetMapping("/profile")
+    public WeightProfileResponse profile(Authentication authentication) {
+        UserPrincipal principal = (UserPrincipal) authentication.getPrincipal();
+        return weightService.getProfile(principal.getUserId());
+    }
+
+    @GetMapping("/intakes")
+    public WeightDailyIntakesResponse intakes(
+            @RequestParam(defaultValue = "0") int page,
+            @RequestParam(defaultValue = "5") int size,
+            Authentication authentication) {
+        if (size < 1) {
+            size = 5;
+        }
+        if (size > 50) {
+            size = 50;
+        }
+        if (page < 0) {
+            page = 0;
+        }
+
+        UserPrincipal principal = (UserPrincipal) authentication.getPrincipal();
+        return weightService.getDailyIntakes(principal.getUserId(), page, size);
+    }
+
+    @PostMapping("/intakes")
+    @ResponseStatus(HttpStatus.CREATED)
+    public WeightDailyIntakeDto createDailyIntake(
+            @Valid @RequestBody CreateDailyIntakeRequest request,
+            Authentication authentication) {
+        UserPrincipal principal = (UserPrincipal) authentication.getPrincipal();
+        return weightService.createDailyIntake(principal.getUserId(), request);
+    }
+
+    @PutMapping("/profile")
+    public WeightProfileResponse updateProfile(
+            @Valid @RequestBody WeightStartRequest request,
+            Authentication authentication) {
+        UserPrincipal principal = (UserPrincipal) authentication.getPrincipal();
+        return weightService.updateProfile(principal.getUserId(), request);
+    }
+
+    @GetMapping("/today-training")
+    public TodayTrainingInfoDto getTodayTrainingInfo(Authentication authentication) {
+        UserPrincipal principal = (UserPrincipal) authentication.getPrincipal();
+        return weightService.getTodayTrainingInfo(principal.getUserId());
+    }
+}
Index: backend/src/main/java/com/trekr/backend/dto/weight/CreateDailyIntakeRequest.java
===================================================================
--- backend/src/main/java/com/trekr/backend/dto/weight/CreateDailyIntakeRequest.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
+++ backend/src/main/java/com/trekr/backend/dto/weight/CreateDailyIntakeRequest.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
@@ -0,0 +1,22 @@
+package com.trekr.backend.dto.weight;
+
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.PositiveOrZero;
+
+import java.math.BigDecimal;
+
+public class CreateDailyIntakeRequest {
+
+    @NotNull(message = "Calories are required")
+    @PositiveOrZero(message = "Calories must be 0 or greater")
+    private BigDecimal calories;
+
+    public BigDecimal getCalories() {
+        return calories;
+    }
+
+    public void setCalories(BigDecimal calories) {
+        this.calories = calories;
+    }
+}
+
Index: backend/src/main/java/com/trekr/backend/dto/weight/TodayTrainingInfoDto.java
===================================================================
--- backend/src/main/java/com/trekr/backend/dto/weight/TodayTrainingInfoDto.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
+++ backend/src/main/java/com/trekr/backend/dto/weight/TodayTrainingInfoDto.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
@@ -0,0 +1,34 @@
+package com.trekr.backend.dto.weight;
+
+import java.math.BigDecimal;
+
+public class TodayTrainingInfoDto {
+
+    private boolean trainedToday;
+    private BigDecimal totalBurnedCalories;
+
+    public TodayTrainingInfoDto() {
+    }
+
+    public TodayTrainingInfoDto(boolean trainedToday, BigDecimal totalBurnedCalories) {
+        this.trainedToday = trainedToday;
+        this.totalBurnedCalories = totalBurnedCalories;
+    }
+
+    public boolean isTrainedToday() {
+        return trainedToday;
+    }
+
+    public void setTrainedToday(boolean trainedToday) {
+        this.trainedToday = trainedToday;
+    }
+
+    public BigDecimal getTotalBurnedCalories() {
+        return totalBurnedCalories;
+    }
+
+    public void setTotalBurnedCalories(BigDecimal totalBurnedCalories) {
+        this.totalBurnedCalories = totalBurnedCalories;
+    }
+}
+
Index: backend/src/main/java/com/trekr/backend/dto/weight/TrackingStatusResponse.java
===================================================================
--- backend/src/main/java/com/trekr/backend/dto/weight/TrackingStatusResponse.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
+++ backend/src/main/java/com/trekr/backend/dto/weight/TrackingStatusResponse.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
@@ -0,0 +1,22 @@
+package com.trekr.backend.dto.weight;
+
+public class TrackingStatusResponse {
+
+    private boolean tracking;
+
+    public TrackingStatusResponse() {
+    }
+
+    public TrackingStatusResponse(boolean tracking) {
+        this.tracking = tracking;
+    }
+
+    public boolean isTracking() {
+        return tracking;
+    }
+
+    public void setTracking(boolean tracking) {
+        this.tracking = tracking;
+    }
+}
+
Index: backend/src/main/java/com/trekr/backend/dto/weight/WeightDailyIntakeDto.java
===================================================================
--- backend/src/main/java/com/trekr/backend/dto/weight/WeightDailyIntakeDto.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
+++ backend/src/main/java/com/trekr/backend/dto/weight/WeightDailyIntakeDto.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
@@ -0,0 +1,73 @@
+package com.trekr.backend.dto.weight;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+public class WeightDailyIntakeDto {
+
+    private Long dailyIntakeId;
+    private LocalDate date;
+    private BigDecimal calories;
+    private boolean trainedThatDay;
+    private BigDecimal burnedCalories;
+
+    public WeightDailyIntakeDto() {
+    }
+
+    public WeightDailyIntakeDto(Long dailyIntakeId, LocalDate date, BigDecimal calories) {
+        this.dailyIntakeId = dailyIntakeId;
+        this.date = date;
+        this.calories = calories;
+        this.trainedThatDay = false;
+        this.burnedCalories = BigDecimal.ZERO;
+    }
+
+    public WeightDailyIntakeDto(Long dailyIntakeId, LocalDate date, BigDecimal calories, boolean trainedThatDay, BigDecimal burnedCalories) {
+        this.dailyIntakeId = dailyIntakeId;
+        this.date = date;
+        this.calories = calories;
+        this.trainedThatDay = trainedThatDay;
+        this.burnedCalories = burnedCalories;
+    }
+
+    public Long getDailyIntakeId() {
+        return dailyIntakeId;
+    }
+
+    public void setDailyIntakeId(Long dailyIntakeId) {
+        this.dailyIntakeId = dailyIntakeId;
+    }
+
+    public LocalDate getDate() {
+        return date;
+    }
+
+    public void setDate(LocalDate date) {
+        this.date = date;
+    }
+
+    public BigDecimal getCalories() {
+        return calories;
+    }
+
+    public void setCalories(BigDecimal calories) {
+        this.calories = calories;
+    }
+
+    public boolean isTrainedThatDay() {
+        return trainedThatDay;
+    }
+
+    public void setTrainedThatDay(boolean trainedThatDay) {
+        this.trainedThatDay = trainedThatDay;
+    }
+
+    public BigDecimal getBurnedCalories() {
+        return burnedCalories;
+    }
+
+    public void setBurnedCalories(BigDecimal burnedCalories) {
+        this.burnedCalories = burnedCalories;
+    }
+}
+
Index: backend/src/main/java/com/trekr/backend/dto/weight/WeightDailyIntakesResponse.java
===================================================================
--- backend/src/main/java/com/trekr/backend/dto/weight/WeightDailyIntakesResponse.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
+++ backend/src/main/java/com/trekr/backend/dto/weight/WeightDailyIntakesResponse.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
@@ -0,0 +1,44 @@
+package com.trekr.backend.dto.weight;
+
+import java.util.List;
+
+public class WeightDailyIntakesResponse {
+
+    private List<WeightDailyIntakeDto> intakes;
+    private boolean hasMore;
+    private boolean hasTodayIntake;
+
+    public WeightDailyIntakesResponse() {
+    }
+
+    public WeightDailyIntakesResponse(List<WeightDailyIntakeDto> intakes, boolean hasMore, boolean hasTodayIntake) {
+        this.intakes = intakes;
+        this.hasMore = hasMore;
+        this.hasTodayIntake = hasTodayIntake;
+    }
+
+    public List<WeightDailyIntakeDto> getIntakes() {
+        return intakes;
+    }
+
+    public void setIntakes(List<WeightDailyIntakeDto> intakes) {
+        this.intakes = intakes;
+    }
+
+    public boolean isHasMore() {
+        return hasMore;
+    }
+
+    public void setHasMore(boolean hasMore) {
+        this.hasMore = hasMore;
+    }
+
+    public boolean isHasTodayIntake() {
+        return hasTodayIntake;
+    }
+
+    public void setHasTodayIntake(boolean hasTodayIntake) {
+        this.hasTodayIntake = hasTodayIntake;
+    }
+}
+
Index: backend/src/main/java/com/trekr/backend/dto/weight/WeightProfileResponse.java
===================================================================
--- backend/src/main/java/com/trekr/backend/dto/weight/WeightProfileResponse.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
+++ backend/src/main/java/com/trekr/backend/dto/weight/WeightProfileResponse.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
@@ -0,0 +1,56 @@
+package com.trekr.backend.dto.weight;
+
+import java.math.BigDecimal;
+
+public class WeightProfileResponse {
+
+    private BigDecimal weight;
+    private BigDecimal height;
+    private BigDecimal goalWeight;
+    private BigDecimal goalCalories;
+
+    public WeightProfileResponse() {
+    }
+
+    public WeightProfileResponse(BigDecimal weight, BigDecimal height, BigDecimal goalWeight,
+            BigDecimal goalCalories) {
+        this.weight = weight;
+        this.height = height;
+        this.goalWeight = goalWeight;
+        this.goalCalories = goalCalories;
+    }
+
+    public BigDecimal getWeight() {
+        return weight;
+    }
+
+    public void setWeight(BigDecimal weight) {
+        this.weight = weight;
+    }
+
+    public BigDecimal getHeight() {
+        return height;
+    }
+
+    public void setHeight(BigDecimal height) {
+        this.height = height;
+    }
+
+    public BigDecimal getGoalWeight() {
+        return goalWeight;
+    }
+
+    public void setGoalWeight(BigDecimal goalWeight) {
+        this.goalWeight = goalWeight;
+    }
+
+
+    public BigDecimal getGoalCalories() {
+        return goalCalories;
+    }
+
+    public void setGoalCalories(BigDecimal goalCalories) {
+        this.goalCalories = goalCalories;
+    }
+}
+
Index: backend/src/main/java/com/trekr/backend/dto/weight/WeightStartRequest.java
===================================================================
--- backend/src/main/java/com/trekr/backend/dto/weight/WeightStartRequest.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
+++ backend/src/main/java/com/trekr/backend/dto/weight/WeightStartRequest.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
@@ -0,0 +1,69 @@
+package com.trekr.backend.dto.weight;
+
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Positive;
+import jakarta.validation.constraints.PositiveOrZero;
+
+import java.math.BigDecimal;
+
+public class WeightStartRequest {
+
+    @NotNull(message = "Current weight is required")
+    @Positive(message = "Current weight must be greater than 0")
+    private BigDecimal weight;
+
+    @NotNull(message = "Height is required")
+    @Positive(message = "Height must be greater than 0")
+    private BigDecimal height;
+
+    @NotNull(message = "Goal weight is required")
+    @Positive(message = "Goal weight must be greater than 0")
+    private BigDecimal goalWeight;
+
+    @PositiveOrZero(message = "Goal calories must be 0 or greater")
+    private BigDecimal goalCalories;
+
+    private Boolean autoCalculateTargets = Boolean.TRUE;
+
+    public BigDecimal getWeight() {
+        return weight;
+    }
+
+    public void setWeight(BigDecimal weight) {
+        this.weight = weight;
+    }
+
+    public BigDecimal getHeight() {
+        return height;
+    }
+
+    public void setHeight(BigDecimal height) {
+        this.height = height;
+    }
+
+    public BigDecimal getGoalWeight() {
+        return goalWeight;
+    }
+
+    public void setGoalWeight(BigDecimal goalWeight) {
+        this.goalWeight = goalWeight;
+    }
+
+
+    public BigDecimal getGoalCalories() {
+        return goalCalories;
+    }
+
+    public void setGoalCalories(BigDecimal goalCalories) {
+        this.goalCalories = goalCalories;
+    }
+
+    public Boolean getAutoCalculateTargets() {
+        return autoCalculateTargets;
+    }
+
+    public void setAutoCalculateTargets(Boolean autoCalculateTargets) {
+        this.autoCalculateTargets = autoCalculateTargets;
+    }
+}
+
Index: backend/src/main/java/com/trekr/backend/entity/weight/WeightUser.java
===================================================================
--- backend/src/main/java/com/trekr/backend/entity/weight/WeightUser.java	(revision 89156c1feb4b06a2d4ecb2bbac89f7c39f0df7e2)
+++ backend/src/main/java/com/trekr/backend/entity/weight/WeightUser.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
@@ -81,4 +81,5 @@
     }
 
+
     public BigDecimal getGoalCalories() {
         return goalCalories;
Index: backend/src/main/java/com/trekr/backend/repository/DailyIntakeRepository.java
===================================================================
--- backend/src/main/java/com/trekr/backend/repository/DailyIntakeRepository.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
+++ backend/src/main/java/com/trekr/backend/repository/DailyIntakeRepository.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
@@ -0,0 +1,17 @@
+package com.trekr.backend.repository;
+
+import com.trekr.backend.entity.weight.DailyIntake;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.time.LocalDate;
+
+@Repository
+public interface DailyIntakeRepository extends JpaRepository<DailyIntake, Long> {
+    Page<DailyIntake> findByWeightUser_UserIdOrderByDateDesc(Long userId, Pageable pageable);
+
+    boolean existsByWeightUser_UserIdAndDate(Long userId, LocalDate date);
+}
+
Index: backend/src/main/java/com/trekr/backend/repository/TrainingSessionRepository.java
===================================================================
--- backend/src/main/java/com/trekr/backend/repository/TrainingSessionRepository.java	(revision 89156c1feb4b06a2d4ecb2bbac89f7c39f0df7e2)
+++ backend/src/main/java/com/trekr/backend/repository/TrainingSessionRepository.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
@@ -10,3 +10,4 @@
 public interface TrainingSessionRepository extends JpaRepository<TrainingSession, Long> {
     Page<TrainingSession> findByTrainingUser_UserIdOrderByDateDesc(Long userId, Pageable pageable);
+    java.util.List<TrainingSession> findByTrainingUser_UserIdAndDate(Long userId, java.time.LocalDate date);
 }
Index: backend/src/main/java/com/trekr/backend/repository/WeightUserRepository.java
===================================================================
--- backend/src/main/java/com/trekr/backend/repository/WeightUserRepository.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
+++ backend/src/main/java/com/trekr/backend/repository/WeightUserRepository.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
@@ -0,0 +1,10 @@
+package com.trekr.backend.repository;
+
+import com.trekr.backend.entity.weight.WeightUser;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface WeightUserRepository extends JpaRepository<WeightUser, Long> {
+}
+
Index: backend/src/main/java/com/trekr/backend/service/WeightService.java
===================================================================
--- backend/src/main/java/com/trekr/backend/service/WeightService.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
+++ backend/src/main/java/com/trekr/backend/service/WeightService.java	(revision 708af9efba48db0445f07728b5d091a3d8898876)
@@ -0,0 +1,212 @@
+package com.trekr.backend.service;
+
+import com.trekr.backend.dto.weight.CreateDailyIntakeRequest;
+import com.trekr.backend.dto.weight.TodayTrainingInfoDto;
+import com.trekr.backend.dto.weight.WeightDailyIntakeDto;
+import com.trekr.backend.dto.weight.WeightDailyIntakesResponse;
+import com.trekr.backend.dto.weight.WeightProfileResponse;
+import com.trekr.backend.dto.weight.WeightStartRequest;
+import com.trekr.backend.entity.User;
+import com.trekr.backend.entity.weight.DailyIntake;
+import com.trekr.backend.entity.weight.WeightUser;
+import com.trekr.backend.repository.DailyIntakeRepository;
+import com.trekr.backend.repository.TrainingSessionRepository;
+import com.trekr.backend.repository.UserRepository;
+import com.trekr.backend.repository.WeightUserRepository;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+@Service
+public class WeightService {
+
+    private static final BigDecimal CALORIE_WEIGHT_FACTOR = new BigDecimal("10");
+    private static final BigDecimal CALORIE_HEIGHT_FACTOR = new BigDecimal("6.25");
+    private static final BigDecimal CALORIE_BASE = new BigDecimal("50");
+    private static final BigDecimal LOSS_CALORIE_DELTA = new BigDecimal("500");
+    private static final BigDecimal GAIN_CALORIE_DELTA = new BigDecimal("300");
+
+    private final WeightUserRepository weightUserRepository;
+    private final DailyIntakeRepository dailyIntakeRepository;
+    private final UserRepository userRepository;
+    private final TrainingSessionRepository trainingSessionRepository;
+
+    public WeightService(
+            WeightUserRepository weightUserRepository,
+            DailyIntakeRepository dailyIntakeRepository,
+            UserRepository userRepository,
+            TrainingSessionRepository trainingSessionRepository) {
+        this.weightUserRepository = weightUserRepository;
+        this.dailyIntakeRepository = dailyIntakeRepository;
+        this.userRepository = userRepository;
+        this.trainingSessionRepository = trainingSessionRepository;
+    }
+
+    public boolean isTracking(Long userId) {
+        return weightUserRepository.existsById(userId);
+    }
+
+    @Transactional
+    public void startTracking(Long userId, WeightStartRequest request) {
+        if (weightUserRepository.existsById(userId)) {
+            return;
+        }
+
+        User user = userRepository.findById(userId)
+                .orElseThrow(() -> new RuntimeException("User not found"));
+
+        BigDecimal goalCalories = resolveGoalCalories(request, request.getWeight(), request.getHeight(), request.getGoalWeight());
+
+        WeightUser weightUser = new WeightUser();
+        weightUser.setUser(user);
+        weightUser.setWeight(request.getWeight());
+        weightUser.setHeight(request.getHeight());
+        weightUser.setGoalWeight(request.getGoalWeight());
+        weightUser.setGoalCalories(goalCalories);
+
+        weightUserRepository.save(weightUser);
+    }
+
+    public WeightProfileResponse getProfile(Long userId) {
+        WeightUser weightUser = weightUserRepository.findById(userId)
+                .orElseThrow(() -> new RuntimeException("Weight tracking is not enabled for this user"));
+
+        return new WeightProfileResponse(
+                weightUser.getWeight(),
+                weightUser.getHeight(),
+                weightUser.getGoalWeight(),
+                weightUser.getGoalCalories());
+    }
+
+    public WeightDailyIntakesResponse getDailyIntakes(Long userId, int page, int size) {
+        if (!weightUserRepository.existsById(userId)) {
+            return new WeightDailyIntakesResponse(List.of(), false, false);
+        }
+
+        Page<DailyIntake> result = dailyIntakeRepository
+                .findByWeightUser_UserIdOrderByDateDesc(userId, PageRequest.of(page, size));
+
+        List<WeightDailyIntakeDto> intakes = result.getContent().stream()
+                .map(d -> {
+                    // Fetch training data for this date
+                    var trainingSessions = trainingSessionRepository.findByTrainingUser_UserIdAndDate(userId, d.getDate());
+                    boolean trainedThatDay = !trainingSessions.isEmpty();
+                    BigDecimal burnedCalories = trainingSessions.stream()
+                            .map(ts -> ts.getCalories() != null ? ts.getCalories() : BigDecimal.ZERO)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add)
+                            .setScale(2, java.math.RoundingMode.HALF_UP);
+                    
+                    return new WeightDailyIntakeDto(
+                            d.getDailyIntakeId(),
+                            d.getDate(),
+                            d.getCalories(),
+                            trainedThatDay,
+                            burnedCalories);
+                })
+                .toList();
+
+        boolean hasTodayIntake = dailyIntakeRepository.existsByWeightUser_UserIdAndDate(userId, LocalDate.now());
+        return new WeightDailyIntakesResponse(intakes, result.hasNext(), hasTodayIntake);
+    }
+
+    @Transactional
+    public WeightDailyIntakeDto createDailyIntake(Long userId, CreateDailyIntakeRequest request) {
+        WeightUser weightUser = weightUserRepository.findById(userId)
+                .orElseThrow(() -> new RuntimeException("Weight tracking is not enabled for this user"));
+
+        LocalDate today = LocalDate.now();
+        if (dailyIntakeRepository.existsByWeightUser_UserIdAndDate(userId, today)) {
+            throw new RuntimeException("Today's intake has already been recorded");
+        }
+
+        DailyIntake intake = new DailyIntake();
+        intake.setWeightUser(weightUser);
+        intake.setCalories(request.getCalories());
+        intake.setDate(today);
+
+        DailyIntake saved = dailyIntakeRepository.save(intake);
+        
+        // Fetch today's training data
+        var trainingSessions = trainingSessionRepository.findByTrainingUser_UserIdAndDate(userId, today);
+        boolean trainedToday = !trainingSessions.isEmpty();
+        BigDecimal burnedCalories = trainingSessions.stream()
+                .map(ts -> ts.getCalories() != null ? ts.getCalories() : BigDecimal.ZERO)
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .setScale(2, java.math.RoundingMode.HALF_UP);
+        
+        return new WeightDailyIntakeDto(saved.getDailyIntakeId(), saved.getDate(), saved.getCalories(), trainedToday, burnedCalories);
+    }
+
+    @Transactional
+    public WeightProfileResponse updateProfile(Long userId, WeightStartRequest request) {
+        WeightUser weightUser = weightUserRepository.findById(userId)
+                .orElseThrow(() -> new RuntimeException("Weight tracking is not enabled for this user"));
+
+        BigDecimal goalCalories = resolveGoalCalories(request, request.getWeight(), request.getHeight(), request.getGoalWeight());
+
+        weightUser.setWeight(request.getWeight());
+        weightUser.setHeight(request.getHeight());
+        weightUser.setGoalWeight(request.getGoalWeight());
+        weightUser.setGoalCalories(goalCalories);
+
+        WeightUser updated = weightUserRepository.save(weightUser);
+        return new WeightProfileResponse(
+                updated.getWeight(),
+                updated.getHeight(),
+                updated.getGoalWeight(),
+                updated.getGoalCalories());
+    }
+
+    public TodayTrainingInfoDto getTodayTrainingInfo(Long userId) {
+        // Try to get training user, if doesn't exist just return zeros
+        var trainingUser = trainingSessionRepository.findByTrainingUser_UserIdAndDate(userId, LocalDate.now());
+
+        boolean trainedToday = !trainingUser.isEmpty();
+        BigDecimal totalBurnedCalories = trainingUser.stream()
+                .map(ts -> ts.getCalories() != null ? ts.getCalories() : BigDecimal.ZERO)
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .setScale(2, java.math.RoundingMode.HALF_UP);
+
+        return new TodayTrainingInfoDto(trainedToday, totalBurnedCalories);
+    }
+
+    private static BigDecimal resolveGoalCalories(
+            WeightStartRequest request,
+            BigDecimal currentWeight,
+            BigDecimal height,
+            BigDecimal goalWeight) {
+        if (!Boolean.FALSE.equals(request.getAutoCalculateTargets())) {
+            return calculateGoalCalories(currentWeight, height, goalWeight);
+        }
+
+        BigDecimal goalCalories = request.getGoalCalories();
+        if (goalCalories == null) {
+            throw new RuntimeException("Goal calories are required when auto-calculation is disabled");
+        }
+        if (goalCalories.compareTo(BigDecimal.ZERO) < 0) {
+            throw new RuntimeException("Goal calories must be 0 or greater");
+        }
+        return goalCalories.setScale(2, java.math.RoundingMode.HALF_UP);
+    }
+
+    private static BigDecimal calculateGoalCalories(BigDecimal currentWeight, BigDecimal height, BigDecimal goalWeight) {
+        BigDecimal maintenanceCalories = currentWeight.multiply(CALORIE_WEIGHT_FACTOR)
+                .add(height.multiply(CALORIE_HEIGHT_FACTOR))
+                .add(CALORIE_BASE)
+                .setScale(2, java.math.RoundingMode.HALF_UP);
+
+        int direction = goalWeight.compareTo(currentWeight);
+        if (direction < 0) {
+            return maintenanceCalories.subtract(LOSS_CALORIE_DELTA).max(BigDecimal.ZERO).setScale(2, java.math.RoundingMode.HALF_UP);
+        }
+        if (direction > 0) {
+            return maintenanceCalories.add(GAIN_CALORIE_DELTA).setScale(2, java.math.RoundingMode.HALF_UP);
+        }
+        return maintenanceCalories;
+    }
+}
