import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/model/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/utils/date-utils.dart';
import 'package:doctor_app_flutter/utils/translations_delegate_base_utils.dart';
import 'package:doctor_app_flutter/utils/utils.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher_string.dart';

import '../large_avatar.dart';
import 'header_row.dart';

class PatientProfileAppBar extends StatelessWidget implements PreferredSizeWidget {
  final PatiantInformtion patient;
  final double height;
  final bool isInpatient;
  final bool isDischargedPatient;
  final bool isFromLiveCare;

  final String? doctorName;
  final String? branch;
  final DateTime? appointmentDate;
  final String? profileUrl;
  final String? invoiceNO;
  final String? orderNo;
  final bool isPrescriptions;
  final bool isMedicalFile;
  final String? episode;
  final String? visitDate;
  final String? clinic;
  final bool isAppointmentHeader;
  final bool isFromLabResult;
  final VoidCallback? onPressed;

  PatientProfileAppBar(this.patient,
      {this.height = 0.0,
      this.isInpatient = false,
      this.isDischargedPatient = false,
      this.isFromLiveCare = false,
      this.doctorName,
      this.branch,
      this.appointmentDate,
      this.profileUrl,
      this.invoiceNO,
      this.orderNo,
      this.isPrescriptions = false,
      this.clinic,
      this.isMedicalFile = false,
      this.episode,
      this.visitDate,
      this.isAppointmentHeader = false,
      this.isFromLabResult = false,
      this.onPressed});

  @override
  Widget build(BuildContext context) {
    ProjectViewModel projectViewModel = Provider.of(context);

    int gender = 1;
    if (patient.patientDetails != null) {
      gender = patient.patientDetails!.gender!;
    } else {
      gender = patient.gender!;
    }

    return Container(
      padding: EdgeInsets.only(
        left: 0,
        right: 5,
        bottom: 5,
      ),
      decoration: BoxDecoration(color: Colors.white, border: Border(bottom: BorderSide(color: Color(0xFFEFEFEF)))),
      child: Container(
        padding: EdgeInsets.only(left: 10, right: 10, bottom: 0),
        margin: EdgeInsets.only(top: SizeConfig.isHeightVeryShort ? 30 : 50),
        child: Column(
          children: [
            Container(
              padding: EdgeInsets.only(left: SizeConfig.isHeightVeryShort ? 0 : 12.0),
              child: Row(children: [
                IconButton(
                  icon: Icon(Icons.arrow_back_ios),
                  color: Color(0xFF2B353E), //Colors.black,
                  onPressed: () {
                    if (onPressed != null) onPressed;
                    Navigator.pop(context);
                  },
                ),
                Expanded(
                  child: AppText(
                    patient.firstName != null
                        ? (Utils.capitalize(patient.firstName) + " " + Utils.capitalize(patient.lastName))
                        : Utils.capitalize(patient.fullName ?? patient.patientDetails!.fullName),
                    fontSize: SizeConfig.textMultiplier! * 1.8,
                    fontWeight: FontWeight.bold,
                    fontFamily: 'Poppins',
                    color: Color(0xFF2B353E),
                    isCopyable: true,
                  ),
                ),
                gender == 1
                    ? Icon(
                        DoctorApp.male_2,
                        color: Colors.blue,
                      )
                    : Icon(
                        DoctorApp.female_1,
                        color: Colors.pink,
                      ),
                Container(
                  margin: EdgeInsets.symmetric(horizontal: 4),
                  child: InkWell(
                    onTap: () {
                      launchUrlString("tel://" + patient.mobileNumber!);
                    },
                    child: Icon(
                      Icons.phone,
                      color: Colors.black87,
                    ),
                  ),
                ),
              ]),
            ),
            Row(children: [
              Padding(
                padding: EdgeInsets.only(left: SizeConfig.isHeightVeryShort ? 0 : 12.0),
                child: Container(
                  width: SizeConfig.getTextMultiplierBasedOnWidth() * 20,
                  height: SizeConfig.getTextMultiplierBasedOnWidth() * 20,
                  child: Image.asset(
                    gender == 1 ? 'assets/images/male_avatar.png' : 'assets/images/female_avatar.png',
                    fit: BoxFit.cover,
                  ),
                ),
              ),
              SizedBox(
                width: 10,
              ),
              Expanded(
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    patient.patientStatusType != null
                        ? Container(
                            child: Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: [
                              patient.patientStatusType == 43
                                  ? AppText(
                                      TranslationBase.of(context).arrivedP,
                                      color: AppGlobal.appGreenColor,
                                      fontWeight: FontWeight.bold,
                                      fontFamily: 'Poppins',
                                      fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5,
                                    )
                                  : AppText(
                                      TranslationBase.of(context).notArrived,
                                      color: Colors.red[800]!,
                                      fontWeight: FontWeight.bold,
                                      fontFamily: 'Poppins',
                                      fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5,
                                    ),
                              patient.startTime != null
                                  ? AppText(patient.startTime != null ? patient.startTime! : '',
                                      fontWeight: FontWeight.w700, fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, color: Color(0xFF2E303A))
                                  : SizedBox()
                            ],
                          ))
                        : SizedBox(),

                    Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: [
                        Row(
                          children: [
                            AppText(
                              TranslationBase.of(context).fileNumber,
                              fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3,
                              color: Color(0xFF575757),
                              fontWeight: FontWeight.w600,
                            ),
                            SizedBox(
                              width: 1,
                            ),
                            AppText(
                              patient.patientId.toString(),
                              fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5,
                              color: Color(0xFF2E303A),
                              fontWeight: FontWeight.w700,
                              isCopyable: true,
                            ),
                          ],
                        ),
                        Row(
                          children: [
                            AppText(
                              patient.nationalityName ?? patient.nationality ?? patient.nationalityId ?? '',
                              fontWeight: FontWeight.bold,
                              fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5,
                            ),
                            patient.nationalityFlagURL != null
                                ? ClipRRect(
                                    borderRadius: BorderRadius.circular(20.0),
                                    child: Image.network(
                                      patient.nationalityFlagURL!,
                                      height: 25,
                                      width: 30,
                                      errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {
                                        return Text('No Image');
                                      },
                                    ))
                                : SizedBox()
                          ],
                        )
                      ],
                    ),

                    HeaderRow(
                      label: TranslationBase.of(context).age + " : ",
                      value:
                          "${AppDateUtils.getAgeByBirthday(patient.patientDetails != null ? patient.patientDetails!.dateofBirth ?? "" : patient.dateofBirth ?? "", context, isServerFormat: !isFromLiveCare)}",
                    ),

                    if (patient.appointmentDate != null && patient.appointmentDate!.isNotEmpty && !isFromLabResult)
                      HeaderRow(
                        label: TranslationBase.of(context).appointmentDate + " : ",
                        value: AppDateUtils.getDayMonthYearDateFormatted(AppDateUtils.convertStringToDate(patient.appointmentDate!)),
                      ),
                    if (isFromLabResult)
                      HeaderRow(
                        label: "Result Date: ",
                        value: '${AppDateUtils.getDayMonthYearDateFormatted(appointmentDate!, isArabic: projectViewModel.isArabic)}',
                      ),
                    // if(isInpatient)
                    Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        if (patient.admissionDate != null && patient.admissionDate!.isNotEmpty)
                          HeaderRow(
                            label: patient.admissionDate == null ? "" : TranslationBase.of(context).admissionDate + " : ",
                            value: patient.admissionDate == null ? "" : "${AppDateUtils.getDayMonthYearDateFormatted((AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate.toString())))}",
                          ),
                        if (patient.admissionDate != null)
                          HeaderRow(
                            label: "${TranslationBase.of(context).numOfDays}: ",
                            value: isDischargedPatient && patient.dischargeDate != null
                                ? "${AppDateUtils.getDateTimeFromServerFormat(patient.dischargeDate!).difference(AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate!)).inDays + 1}"
                                : "${DateTime.now().difference(AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate!)).inDays + 1}",
                          )
                      ],
                    ),
                  ],
                ),
              ),
            ]),
            if (isAppointmentHeader)
              Row(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Container(
                    width: 30,
                    height: 30,
                    margin: EdgeInsets.only(left: projectViewModel.isArabic ? 10 : 85, right: projectViewModel.isArabic ? 85 : 10, top: 5),
                    decoration: BoxDecoration(
                        shape: BoxShape.rectangle,
                        border: Border(
                          bottom: BorderSide(color: Colors.grey[400]!, width: 2.5),
                          left: BorderSide(color: Colors.grey[400]!, width: 2.5),
                        )),
                  ),
                  Expanded(
                    child: Container(
                      margin: EdgeInsets.only(top: 10),
                      child: Row(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          Container(
                            child: LargeAvatar(
                              name: doctorName ?? "",
                              url: profileUrl,
                            ),
                            width: 25,
                            height: 25,
                            margin: EdgeInsets.only(top: 10),
                          ),
                          Expanded(
                            flex: 5,
                            child: Container(
                              margin: EdgeInsets.all(10),
                              child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
                                AppText(
                                  Utils.convertToTitleCase('${TranslationBase.of(context).dr}$doctorName'),
                                  color: Color(0xFF2E303A),
                                  fontWeight: FontWeight.w700,
                                  fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5,
                                  isCopyable: true,
                                ),
                                if (orderNo != null && !isPrescriptions)
                                  HeaderRow(
                                    label: 'Order No: ',
                                    value: orderNo ?? '',
                                  ),
                                if (invoiceNO != null && !isPrescriptions)
                                  HeaderRow(
                                    label: 'Invoice: ',
                                    value: invoiceNO ?? "",
                                  ),
                                if (branch != null)
                                  HeaderRow(
                                    label: 'Branch: ',
                                    value: branch ?? '',
                                  ),
                                if (clinic != null)
                                  Container(
                                    width: MediaQuery.of(context).size.width * 0.51,
                                    child: HeaderRow(label: 'Clinic: ', value: Utils.convertToTitleCase(clinic) ?? '', isExpanded: true),
                                  ),
                                if (isMedicalFile && episode != null)
                                  HeaderRow(
                                    label: 'Episode: ',
                                    value: episode ?? '',
                                  ),
                                if (isMedicalFile && visitDate != null)
                                  HeaderRow(
                                    label: 'Visit Date: ',
                                    value: visitDate ?? '',
                                  ),
                                if (!isMedicalFile)
                                  HeaderRow(
                                    label: !isPrescriptions ? 'Result Date:' : 'Prescriptions Date ',
                                    value: '${AppDateUtils.getDayMonthYearDateFormatted(appointmentDate!, isArabic: projectViewModel.isArabic)}',
                                  ),
                              ]),
                            ),
                          ),
                        ],
                      ),
                    ),
                  ),
                ],
              )
          ],
        ),
      ),
    );
  }

  @override
  Size get preferredSize => Size(
      double.maxFinite,
      height == 0
          ? isInpatient
              ? (isFromLabResult ? 210 : 200)
              : isAppointmentHeader
                  ? 340
                  : SizeConfig.isHeightVeryShort
                      ? 137
                      : SizeConfig.isHeightShort
                          ? 190
                          : SizeConfig.heightMultiplier! * (SizeConfig.isWidthLarge ? 25 : 20)
          : height);
}
