[Route("api/[controller]")]
[ApiController]
public class PaymentController : ControllerBase
{
    private readonly AppDbContext _context;

    public PaymentController(AppDbContext context)
    {
        _context = context;
    }

    // 8.1 Make Payment
    [HttpPost("make-payment")]
    public async Task<IActionResult> MakePayment([FromBody] Payment payment)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        _context.Payments.Add(payment);
        await _context.SaveChangesAsync();

        return CreatedAtAction(nameof(ViewPaymentStatus), new { paymentId = payment.Payment_ID }, payment);
    }

    // 8.2 Upload Proof Of Payment
    [HttpPost("upload-proof-of-payment/{paymentId}")]
    public async Task<IActionResult> UploadProofOfPayment(int paymentId, IFormFile file)
    {
        var payment = await _context.Payments.FindAsync(paymentId);
        if (payment == null)
        {
            return NotFound("Payment not found.");
        }

        if (file == null || file.Length == 0)
        {
            return BadRequest("Invalid file.");
        }

        var filePath = Path.Combine("ProofOfPayments", $"{paymentId}_{file.FileName}");

        using (var stream = new FileStream(filePath, FileMode.Create))
        {
            await file.CopyToAsync(stream);
        }

        // Assuming you have a field to store the proof of payment path
        // payment.ProofOfPaymentPath = filePath; // Uncomment and add this field to the Payment model
        _context.Entry(payment).State = EntityState.Modified;
        await _context.SaveChangesAsync();

        return Ok(new { FilePath = filePath });
    }

    // 8.3 Search Payment
    [HttpGet("search-payment")]
    public async Task<IActionResult> SearchPayment([FromQuery] string searchTerm)
    {
        var payments = await _context.Payments
            .Include(p => p.Contract)
            .Include(p => p.Payment_Type)
            .Where(p => p.Contract.Description.Contains(searchTerm) ||
                        p.Payment_Type.Payment_Type_Name.Contains(searchTerm))
            .ToListAsync();

        if (payments == null || !payments.Any())
        {
            return NotFound("No payments found matching the search term.");
        }

        return Ok(payments);
    }

    // 8.4 View Payment Status
    [HttpGet("view-payment-status/{paymentId}")]
    public async Task<IActionResult> ViewPaymentStatus(int paymentId)
    {
        var payment = await _context.Payments
            .Include(p => p.Contract)
            .Include(p => p.Payment_Type)
            .FirstOrDefaultAsync(p => p.Payment_ID == paymentId);

        if (payment == null)
        {
            return NotFound("Payment not found.");
        }

        return Ok(new
        {
            payment.Payment_ID,
            payment.Amount,
            payment.Payment_Date,
            ContractDescription = payment.Contract.Description,
            PaymentTypeName = payment.Payment_Type.Payment_Type_Name,
            // payment.ProofOfPaymentPath // Uncomment if this field is added to the Payment model
        });
    }
}