@model Building_App_Models.Models.MeterBasedWorkRecord
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "ثبت کارکرد متری";
}

<h4>ثبت کارکرد متری / قراردادی</h4>
<hr />

<form asp-action="Create" asp-controller="MeterBasedWorkRecords" method="post" enctype="multipart/form-data">
    <div class="row">
        <div class="col-md-4 mb-3">
            <label class="form-label">پیمانکار جزء</label>
            <select asp-for="SubContractorId" class="form-control" required>
                <option value="">-- انتخاب پیمانکار --</option>
                @foreach (var sub in ViewBag.SubContractors)
                {
                    <option value="@sub.PersonId">@sub.Name @sub.Family</option>
                }
            </select>
        </div>
        <div class="col-md-4 mb-3">
            <label class="form-label">پروژه</label>
            <select asp-for="ProjectId" class="form-control" required>
                <option value="">-- انتخاب پروژه --</option>
                @foreach (var project in ViewBag.Projects)
                {
                    <option value="@project.ProjectId">@project.ProjectName</option>
                }
            </select>
        </div>
        <div class="col-md-4 mb-3">
            <label class="form-label">قرارداد</label>
            <select asp-for="ContractId" class="form-control" id="ContractId">
                <option value="">-- انتخاب قرارداد --</option>
                @foreach (var contract in ViewBag.Contracts)
                {
                    <option value="@contract.Id">@contract.Subject</option>
                }
            </select>
            @* <small id="contractDescription" class="form-text text-muted"></small> *@
        </div>
    </div>

    <div class="row">
        <div class="col-md-6 mb-3">
            <label class="form-label">از تاریخ</label>
            <input type="text" name="FromDateString" class="form-control mydate" required />
        </div>
        <div class="col-md-6 mb-3">
            <label class="form-label">تا تاریخ</label>
            <input type="text" name="ToDateString" class="form-control mydate" required />
        </div>
    </div>

    <div class="mb-3">
        <label class="form-label">تصاویر کار انجام‌شده</label>
        <input type="file" name="images" class="form-control" multiple accept="image/*" />
    </div>

    <div class="mb-3">
        <label class="form-label">آیتم‌های کارکرد</label>

        <!-- هدرهای جدول -->
        <div class="row mb-2 font-weight-bold text-center bg-light py-2">
            <div class="col-1">ردیف</div>
            <div class="col-4">شرح کار</div>
            <div class="col-1">مقدار</div>
            <div class="col-1">واحد</div>
            <div class="col-2">قیمت واحد</div>
            <div class="col-2">جمع کل</div>
            <div class="col-1">حذف</div>
        </div>

        <div id="workItemsContainer">
            <div class="work-item row mb-2 align-items-center">
                <div class="col-1">
                    <input type="text" class="form-control row-number text-center" value="1" readonly />
                </div>
                <div class="col-3">
                    <input type="text" name="workItems[0].Title" class="form-control" placeholder="عنوان آیتم" required />
                </div>
                <div class="col-2">
                    <input type="number" name="workItems[0].Quantity" class="form-control quantity text-center" placeholder="مقدار" step="0.01" required />
                </div>
                <div class="col-1">
                    <select name="workItems[0].Unit" class="form-control unit-select" required>
                        <option value="">واحد</option>
                        <option value="مترمربع">م²</option>
                        <option value="متر">متر</option>
                        <option value="عدد">عدد</option>
                        <option value="طبقه">طبقه</option>
                        <option value="کیلوگرم">کیلو</option>
                        <option value="تن">تن</option>
                    </select>
                </div>
                <div class="col-2">
                    <input type="text" name="workItems[0].UnitPrice" class="form-control unit-price formatted-price" placeholder="قیمت واحد" required />
                </div>
                <div class="col-2">
                    <input type="text" name="workItems[0].TotalPrice" class="form-control total-price formatted-price" readonly />
                </div>
                <div class="col-1 text-center">
                    <button type="button" class="btn btn-danger btn-sm btn-remove-item">✕</button>
                </div>
            </div>
        </div>
        <button type="button" class="btn btn-primary mt-2" id="addWorkItemBtn">افزودن ردیف</button>
    </div>

    <div class="mb-3">
        <h5>جمع کل: <span id="grandTotal" style="font-size: 1.5em; color: #28a745;">0</span> ریال</h5>
    </div>

    <div class="form-group">
        <input type="submit" value="ثبت" class="btn btn-success" />
        <a asp-action="Index" asp-controller="SubContractors" class="btn btn-secondary">بازگشت</a>
    </div>
</form>

@section Scripts {
    <script>
        $(document).ready(function () {
            // تاریخ‌نگار شمسی
            $('.persian-date, .mydate').persianDatepicker({
                format: 'YYYY/MM/DD',
                initialValue: false
            });

            // فرمت‌دهی اعداد با کاما
            function formatNumber(num) {
                if (!num) return '0';
                return parseFloat(num).toLocaleString('en-US');
            }

            function unformatNumber(str) {
                if (!str) return 0;
                return parseFloat(str.replace(/,/g, '')) || 0;
            }

            // رویداد فرمت‌دهی قیمت‌ها
            $(document).on('input', '.formatted-price', function() {
                var value = $(this).val().replace(/,/g, '');
                if (value && !isNaN(value)) {
                    $(this).val(formatNumber(value));
                }
            });

            // فیلتر قراردادها بر اساس پیمانکار و پروژه
            $('#SubContractorId, #ProjectId').change(function () {
                var subContractorId = $('#SubContractorId').val();
                var projectId = $('#ProjectId').val();

                // پاک کردن قرارداد و آیتم‌ها
                $('#ContractId').empty().append('<option value="">-- انتخاب قرارداد --</option>');
                $('#contractDescription').text('');
                resetWorkItems();

                if (subContractorId && projectId) {
                    $.get('@Url.Action("GetContracts")', {
                        subContractorId: subContractorId,
                        projectId: projectId
                    }, function (data) {
                        $.each(data, function (i, contract) {
                            $('#ContractId').append($('<option>', {
                                value: contract.id,
                                text: contract.contractNumber + ' - ' + contract.subject
                            }));
                        });
                    }).fail(function() {
                        console.error('خطا در بارگذاری قراردادها');
                    });
                }
            });

            // انتخاب قرارداد مستقل (بدون وابستگی به پیمانکار و پروژه)
            $('#ContractId').change(function () {
                var contractId = $(this).val();

                if (contractId) {
                    // دریافت جزئیات قرارداد و تنظیم پیمانکار و پروژه
                    $.get('@Url.Action("GetContractDetails")', { contractId: contractId })
                        .done(function (contractDetails) {
                            if (contractDetails) {
                                $('#SubContractorId').val(contractDetails.subContractorId);
                                $('#ProjectId').val(contractDetails.projectId);
                                $('#contractDescription').text(contractDetails.description);
                            }
                        });

                    // بارگذاری آیتم‌های قرارداد
                    $.get('@Url.Action("GetContractItems")', { contractId: contractId })
                        .done(function (items) {
                            // پاک کردن آیتم‌های قبلی
                            $('#workItemsContainer').empty();

                            if (items && items.length > 0) {
                                // افزودن آیتم‌های دریافت شده از دیتابیس
                                $.each(items, function (i, item) {
                                    addWorkItem(item.title, item.unit, item.unitPrice, item.quantity);
                                });
                            } else {
                                // اگر آیتمی وجود نداشت، یک آیتم خالی اضافه کن
                                addWorkItem();
                            }

                            updateGrandTotal();
                        })
                        .fail(function() {
                            console.error('خطا در بارگذاری آیتم‌های قرارداد');
                            // در صورت خطا، یک آیتم خالی اضافه کن
                            $('#workItemsContainer').empty();
                            addWorkItem();
                        });
                } else {
                    // پاک کردن آیتم‌ها و توضیحات
                    resetWorkItems();
                    $('#contractDescription').text('');
                }
            });

            // محاسبه قیمت کل و جمع کل
            $(document).on('input', '.quantity, .unit-price', function () {
                var row = $(this).closest('.work-item');
                var quantity = parseFloat(row.find('.quantity').val()) || 0;
                var unitPrice = unformatNumber(row.find('.unit-price').val()) || 0;
                var totalPrice = quantity * unitPrice;

                row.find('.total-price').val(formatNumber(totalPrice));
                updateGrandTotal();
            });

            // حذف ردیف
            $(document).on('click', '.btn-remove-item', function () {
                if ($('.work-item').length > 1) {
                    $(this).closest('.work-item').remove();
                    updateRowNumbers();
                    updateGrandTotal();
                } else {
                    alert('حداقل یک آیتم کارکرد باید وجود داشته باشد.');
                }
            });

            // اضافه کردن آیتم جدید
            $('#addWorkItemBtn').click(function() {
                addWorkItem();
                updateGrandTotal();
            });

            // فرمت‌دهی جمع کل در ابتدا
            updateGrandTotal();
        });

        function addWorkItem(title = '', unit = '', unitPrice = 0, quantity = 0) {
            var index = $('.work-item').length;
            var formattedUnitPrice = unitPrice > 0 ? parseFloat(unitPrice).toLocaleString('en-US') : '';
            var totalPrice = quantity * unitPrice;
            var formattedTotalPrice = totalPrice > 0 ? parseFloat(totalPrice).toLocaleString('en-US') : '';

            var row = `<div class="work-item row mb-2 align-items-center">
                <div class="col-1">
                    <input type="text" class="form-control row-number text-center" value="${index + 1}" readonly />
                </div>
                <div class="col-3">
                    <input type="text" name="workItems[${index}].Title" class="form-control" value="${title}" placeholder="عنوان آیتم" required />
                </div>
                <div class="col-2">
                    <input type="number" name="workItems[${index}].Quantity" class="form-control quantity text-center" value="${quantity}" placeholder="مقدار" step="0.01" required />
                </div>
                <div class="col-1">
                    <select name="workItems[${index}].Unit" class="form-control unit-select" required>
                        <option value="">واحد</option>
                        <option value="مترمربع" ${unit === 'مترمربع' ? 'selected' : ''}>م²</option>
                        <option value="متر" ${unit === 'متر' ? 'selected' : ''}>متر</option>
                        <option value="عدد" ${unit === 'عدد' ? 'selected' : ''}>عدد</option>
                        <option value="طبقه" ${unit === 'طبقه' ? 'selected' : ''}>طبقه</option>
                        <option value="کیلوگرم" ${unit === 'کیلوگرم' ? 'selected' : ''}>کیلو</option>
                        <option value="تن" ${unit === 'تن' ? 'selected' : ''}>تن</option>
                    </select>
                </div>
                <div class="col-2">
                    <input type="text" name="workItems[${index}].UnitPrice" class="form-control unit-price formatted-price" value="${formattedUnitPrice}" placeholder="قیمت واحد" required />
                </div>
                <div class="col-2">
                    <input type="text" name="workItems[${index}].TotalPrice" class="form-control total-price formatted-price" value="${formattedTotalPrice}" readonly />
                </div>
                <div class="col-1 text-center">
                    <button type="button" class="btn btn-danger btn-sm btn-remove-item">✕</button>
                </div>
            </div>`;

            $('#workItemsContainer').append(row);
        }

        function resetWorkItems() {
            $('#workItemsContainer').empty();
            addWorkItem(); // اضافه کردن یک آیتم خالی
            updateGrandTotal();
        }

        function updateRowNumbers() {
            $('.work-item').each(function (i) {
                $(this).find('.row-number').val(i + 1);
                $(this).find('input, select').each(function () {
                    var name = $(this).attr('name');
                    if (name && name.includes('[')) {
                        $(this).attr('name', name.replace(/\[\d+\]/, `[${i}]`));
                    }
                });
            });
        }

        function updateGrandTotal() {
            var total = 0;
            $('.total-price').each(function () {
                var value = $(this).val().replace(/,/g, '');
                total += parseFloat(value) || 0;
            });
            $('#grandTotal').text(total.toLocaleString('fa-IR'));
        }

        function unformatNumber(str) {
            if (!str) return 0;
            return parseFloat(str.replace(/,/g, '')) || 0;
        }
    </script>
}

using Microsoft.AspNetCore.Mvc;
using Building_App_Service.Service;
using Building_App_Models.Models;
using System.Threading.Tasks;
using BuildingApp_Core_01.Helpers;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Building_App_Models.SubContractorContract;

namespace BuildingApp_Core_01.Areas.ProjectArea.Controllers
{
    [Area("ProjectArea")]
    public class MeterBasedWorkRecordsController : Controller
    {
        private readonly IGenericService<MeterBasedWorkRecord> _meterBasedWorkRecordService;
        private readonly IGenericService<SubContractor> _subContractorService;
        private readonly IGenericService<Project> _projectService;
        private readonly IGenericService<Contract> _contractService;
        private readonly IGenericService<ContractItem> _contractItemService;

        public MeterBasedWorkRecordsController(
            IGenericService<MeterBasedWorkRecord> meterBasedWorkRecordService,
            IGenericService<SubContractor> subContractorService,
            IGenericService<Project> projectService,
            IGenericService<Contract> contractService,
            IGenericService<ContractItem> contractItemService)
        {
            _meterBasedWorkRecordService = meterBasedWorkRecordService;
            _subContractorService = subContractorService;
            _projectService = projectService;
            _contractService = contractService;
            _contractItemService = contractItemService;
        }

        [HttpGet]
        public async Task<IActionResult> Create()
        {
            ViewBag.SubContractors = await _subContractorService.GetAllAsync();
            ViewBag.Projects = await _projectService.GetAllAsync();
            ViewBag.Contracts = await _contractService.GetAllAsync();
            return View("~/Areas/ProjectArea/Views/MeterBasedWorkRecords/Create.cshtml", new MeterBasedWorkRecord());
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(MeterBasedWorkRecord workRecord, List<MeterBasedWorkItem> workItems, IFormFile[] images)
        {
            if (!ModelState.IsValid || workItems == null || !workItems.Any())
            {
                ViewBag.SubContractors = await _subContractorService.GetAllAsync();
                ViewBag.Projects = await _projectService.GetAllAsync();
                ViewBag.Contracts = await _contractService.GetAllAsync();
                return View("~/Areas/ProjectArea/Views/MeterBasedWorkRecords/Create.cshtml", workRecord);
            }

            // تبدیل تاریخ‌های فارسی به میلادی
            workRecord.FromDate = DateHelper.ConvertPersianToGregorian(Request.Form["FromDateString"]);
            workRecord.ToDate = DateHelper.ConvertPersianToGregorian(Request.Form["ToDateString"]);

            // محاسبه TotalPrice برای هر آیتم و TotalAmount کلی
            decimal totalAmount = 0;
            foreach (var item in workItems)
            {
                item.TotalPrice = item.Quantity * item.UnitPrice;
                totalAmount += item.TotalPrice;
            }
            workRecord.TotalAmount = totalAmount;
            workRecord.WorkItems = workItems;

            // ذخیره تصاویر
            await SaveWorkRecordImages(workRecord, images);

            // ذخیره در دیتابیس
            await _meterBasedWorkRecordService.AddAsync(workRecord);

            TempData["SuccessMessage"] = "کارکرد متری با موفقیت ثبت شد.";
            return RedirectToAction("Index", "SubContractors");
        }

        [HttpGet]
        public async Task<IActionResult> GetContracts(int subContractorId, int projectId)
        {
            var contracts = await _contractService.GetAllAsync();
            var filteredContracts = contracts
                .Where(c => c.SubContractorId == subContractorId && c.ProjectId == projectId)
                .Select(c => new
                {
                    c.Id,
                    c.ContractNumber,
                    c.Subject,
                    c.SubContractorId,
                    c.ProjectId,
                    Description = $"قرارداد {c.Subject} - {c.ContractNumber}"
                });
            return Json(filteredContracts);
        }

        [HttpGet]
        public async Task<IActionResult> GetContractDetails(int contractId)
        {
            try
            {
                var contracts = await _contractService.GetAllAsync();
                var contract = contracts.FirstOrDefault(c => c.Id == contractId);

                if (contract != null)
                {
                    return Json(new
                    {
                        subContractorId = contract.SubContractorId,
                        projectId = contract.ProjectId,
                        description = $"قرارداد {contract.Subject} - {contract.ContractNumber}"
                    });
                }

                return Json(null);
            }
            catch (Exception ex)
            {
                return Json(null);
            }
        }

        [HttpGet]
        public async Task<IActionResult> GetContractItems(int contractId)
        {
            try
            {
                // بازیابی آیتم‌های قرارداد از دیتابیس
                var contractItems = await _contractItemService.GetAllAsync();
                var filteredItems = contractItems
                    .Where(ci => ci.ContractId == contractId)
                    .Select(ci => new
                    {
                        title = ci.Title,
                        unit = ci.Unit,
                        unitPrice = ci.UnitPrice,
                        quantity = 0 // مقدار پیش‌فرض صفر برای ورودی کاربر
                    })
                    .ToList();

                return Json(filteredItems);
            }
            catch (Exception ex)
            {
                // در صورت بروز خطا، لیست خالی برگردانید
                return Json(new List<object>());
            }
        }

        private async Task SaveWorkRecordImages(MeterBasedWorkRecord workRecord, IFormFile[] images)
        {
            var imageFields = new[] { "Image1", "Image2", "Image3" };
            var uploadsFolder = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "Images", "MeterBasedWorkRecords");

            if (!Directory.Exists(uploadsFolder))
                Directory.CreateDirectory(uploadsFolder);

            for (int i = 0; i < images.Length && i < 3; i++)
            {
                if (images[i] != null && images[i].Length > 0)
                {
                    var fileName = Guid.NewGuid().ToString() + Path.GetExtension(images[i].FileName);
                    var filePath = Path.Combine(uploadsFolder, fileName);
                    using (var stream = new FileStream(filePath, FileMode.Create))
                    {
                        await images[i].CopyToAsync(stream);
                    }
                    typeof(MeterBasedWorkRecord).GetProperty(imageFields[i])?.SetValue(workRecord, fileName);
                }
            }
        }
    }
}


وقتی قرارداد از دراپ دان قراردادها انتخاب می شه، پروژه و پیمانکار ذخیره شده در مدل Contract هم در دراپ دان های پروژه و پیمانکار در فرم کارکرد متری پیمانکار تنظیم بشه